ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcmVndWxhdG9yIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IKaW5kZXggNzlhNGE3NS4uMzczMWY2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IKQEAgLTEsNyArMSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N0YXRlCiBEYXRlOgkJQXByaWwgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2Ci1Db250YWN0OglMaWFtIEdpcmR3b29kIDxsZ0BvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CitDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246CiAJCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgc3RhdGUuCkBAIC0yNyw3ICsyNyw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3R5cGUKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQl0eXBlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3IgdHlwZS4KQEAgLTUxLDcgKzUxLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWljcm92b2x0cwogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSBzZXR0aW5nCkBAIC02NSw3ICs2NSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL21pY3JvYW1wcwogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dCBjdXJyZW50IGxpbWl0CkBAIC03OSw3ICs3OSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL29wbW9kZQogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW9wbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlIHNldHRpbmcuCkBAIC0xMDIsNyArMTAyLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWluX21pY3Jvdm9sdHMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltaW5fbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgbWluaW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCkBAIC0xMTYsNyArMTE2LDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWF4X21pY3Jvdm9sdHMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltYXhfbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgbWF4aW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCkBAIC0xMzAsNyArMTMwLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWluX21pY3JvYW1wcwogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pbl9taWNyb2FtcHMuIFRoaXMgaG9sZHMgdGhlIG1pbmltdW0gc2FmZSB3b3JraW5nIHJlZ3VsYXRvcgpAQCAtMTQ1LDcgKzE0NSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL21heF9taWNyb2FtcHMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltYXhfbWljcm9hbXBzLiBUaGlzIGhvbGRzIHRoZSBtYXhpbXVtIHNhZmUgd29ya2luZyByZWd1bGF0b3IKQEAgLTE1NywxMCArMTU3LDIzIEBACiAJCXBsYXRmb3JtIGNvZGUuCiAKIAorV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9uYW1lCitEYXRlOgkJT2N0b2JlciAyMDA4CitLZXJuZWxWZXJzaW9uOgkyLjYuMjgKK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CitEZXNjcmlwdGlvbjoKKwkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQluYW1lLiBUaGlzIGhvbGRzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSByZWd1bGF0b3IgZm9yCisJCWRpc3BsYXkgcHVycG9zZXMuCisKKwkJTk9URTogdGhpcyB3aWxsIGJlIGVtcHR5IGlmIG5vIHN1aXRhYmxlIG5hbWUgaXMgcHJvdmlkZWQKKwkJYnkgcGxhdGZvcm0gb3IgcmVndWxhdG9yIGRyaXZlcnMuCisKKwogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9udW1fdXNlcnMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQludW1fdXNlcnMuIFRoaXMgaG9sZHMgdGhlIG51bWJlciBvZiBjb25zdW1lciBkZXZpY2VzIHRoYXQKQEAgLTE3MCw3ICsxODMsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9yZXF1ZXN0ZWRfbWljcm9hbXBzCiBEYXRlOgkJQXByaWwgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2Ci1Db250YWN0OglMaWFtIEdpcmR3b29kIDxsZ0BvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CitDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246CiAJCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJcmVxdWVzdGVkX21pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgdG90YWwgcmVxdWVzdGVkIGxvYWQKQEAgLTE4MSw3ICsxOTQsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9wYXJlbnQKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgbGluayBjYWxsZWQgcGFyZW50LgogCQlUaGlzIHBvaW50cyB0byB0aGUgcGFyZW50IG9yIHN1cHBseSByZWd1bGF0b3IgaWYgb25lIGV4aXN0cy4KQEAgLTE4OSw3ICsyMDIsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX21lbV9taWNyb3ZvbHRzCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfbWVtX21pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQKQEAgLTIwMyw3ICsyMTYsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX2Rpc2tfbWljcm92b2x0cwogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dApAQCAtMjE3LDcgKzIzMCw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0CkBAIC0yMzEsNyArMjQ0LDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9tZW1fbW9kZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX21lbV9tb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUKQEAgLTI0NSw3ICsyNTgsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX2Rpc2tfbW9kZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlCkBAIC0yNTgsNyArMjcxLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9zdGFuZGJ5X21vZGUKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2Ci1Db250YWN0OglMaWFtIEdpcmR3b29kIDxsZ0BvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CitDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246CiAJCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9zdGFuZGJ5X21vZGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcgbW9kZQpAQCAtMjcyLDcgKzI4NSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfbWVtX3N0YXRlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfbWVtX3N0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIHN0YXRlCkBAIC0yODcsNyArMzAwLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9kaXNrX3N0YXRlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfZGlza19zdGF0ZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBzdGF0ZQpAQCAtMzAyLDcgKzMxNSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX3N0YW5kYnlfc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCBjYzgwOTNjLi40ZDI1NjZhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC0yODcsNiArMjg3LDEzIEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OglyZW1vdmUgSElEIGNvbXBhdCBzdXBwb3J0CitXaGVuOgkyLjYuMjkKK1doeToJbmVlZGVkIG9ubHkgYXMgYSB0ZW1wb3Jhcnkgc29sdXRpb24gdW50aWwgZGlzdHJvcyBmaXggdGhlbXNlbHZlcyB1cAorV2hvOglKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJL3N5cy9vMmNiIHN5bWxpbmsKIFdoZW46CUphbnVhcnkgMjAxMAogV2h5Ogkvc3lzL2ZzL28yY2IgaXMgdGhlIHByb3BlciBsb2NhdGlvbiBmb3IgdGhpcyBpbmZvcm1hdGlvbiAtIC9zeXMvbzJjYgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vY2ZzMi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dAppbmRleCBjMzE4YThiLi40MzQwY2M4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dApAQCAtNzYsMyArNzYsOSBAQAogCQkJbGFyZ2UsIHRoZSBmcyB3aWxsIHNpbGVudGx5IHJldmVydCBpdCB0byB0aGUgZGVmYXVsdC4KIAkJCUxvY2FsYWxsb2MgaXMgbm90IGVuYWJsZWQgZm9yIGxvY2FsIG1vdW50cy4KIGxvY2FsZmxvY2tzCQlUaGlzIGRpc2FibGVzIGNsdXN0ZXIgYXdhcmUgZmxvY2suCitpbm9kZTY0CQkJSW5kaWNhdGVzIHRoYXQgT2NmczIgaXMgYWxsb3dlZCB0byBjcmVhdGUgaW5vZGVzIGF0CisJCQlhbnkgbG9jYXRpb24gaW4gdGhlIGZpbGVzeXN0ZW0sIGluY2x1ZGluZyB0aG9zZSB3aGljaAorCQkJd2lsbCByZXN1bHQgaW4gaW5vZGUgbnVtYmVycyBvY2N1cHlpbmcgbW9yZSB0aGFuIDMyCisJCQliaXRzIG9mIHNpZ25pZmljYW5jZS4KK3VzZXJfeGF0dHIJKCopCUVuYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLgorbm91c2VyX3hhdHRyCQlEaXNhYmxlcyBFeHRlbmRlZCBVc2VyIEF0dHJpYnV0ZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXZpYXBybyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCmluZGV4IDE0MDVmYjYuLjIyZWZlZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCkBAIC0xNiw2ICsxNiw5IEBACiAgICogVklBIFRlY2hub2xvZ2llcywgSW5jLiBDWDcwMAogICAgIERhdGFzaGVldDogYXZhaWxhYmxlIG9uIHJlcXVlc3QgYW5kIHVuZGVyIE5EQSBmcm9tIFZJQQogCisgICogVklBIFRlY2hub2xvZ2llcywgSW5jLiBWWDgwMC9WWDgyMAorICAgIERhdGFzaGVldDogYXZhaWxhYmxlIG9uIGh0dHA6Ly9saW51eC52aWEuY29tLnR3CisKIEF1dGhvcnM6CiAJS3nDtnN0aSBNw6Rsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sCiAJTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKQEAgLTQ5LDYgKzUyLDcgQEAKICBkZXZpY2UgMTEwNjozMzcyICAgKFZUODIzN1MpCiAgZGV2aWNlIDExMDY6MzI4NyAgIChWVDgyNTEpCiAgZGV2aWNlIDExMDY6ODMyNCAgIChDWDcwMCkKKyBkZXZpY2UgMTEwNjo4MzUzICAgKFZYODAwL1ZYODIwKQogCiBJZiBub25lIG9mIHRoZXNlIHNob3cgdXAsIHlvdSBzaG91bGQgbG9vayBpbiB0aGUgQklPUyBmb3Igc2V0dGluZ3MgbGlrZQogZW5hYmxlIEFDUEkgLyBTTUJ1cyBvciBldmVuIFVTQi4KQEAgLTU3LDUgKzYxLDUgQEAKIFZUODIzMSksIHRoaXMgZHJpdmVyIHN1cHBvcnRzIEkyQyBibG9jayB0cmFuc2FjdGlvbnMuIFN1Y2ggdHJhbnNhY3Rpb25zCiBhcmUgbWFpbmx5IHVzZWZ1bCB0byByZWFkIGZyb20gYW5kIHdyaXRlIHRvIEVFUFJPTXMuCiAKLVRoZSBDWDcwMCBhZGRpdGlvbmFsbHkgYXBwZWFycyB0byBzdXBwb3J0IFNNQnVzIFBFQywgYWx0aG91Z2ggdGhpcyBkcml2ZXIKLWRvZXNuJ3QgaW1wbGVtZW50IGl0IHlldC4KK1RoZSBDWDcwMC9WWDgwMC9WWDgyMCBhZGRpdGlvbmFsbHkgYXBwZWFycyB0byBzdXBwb3J0IFNNQnVzIFBFQywgYWx0aG91Z2gKK3RoaXMgZHJpdmVyIGRvZXNuJ3QgaW1wbGVtZW50IGl0IHlldC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2kyYy9kZXYtaW50ZXJmYWNlCmluZGV4IDlkZDc5MTIuLjNlNzQyYmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZQpAQCAtNCw2ICs0LDEwIEBACiAKIEVhY2ggcmVnaXN0ZXJlZCBpMmMgYWRhcHRlciBnZXRzIGEgbnVtYmVyLCBjb3VudGluZyBmcm9tIDAuIFlvdSBjYW4KIGV4YW1pbmUgL3N5cy9jbGFzcy9pMmMtZGV2LyB0byBzZWUgd2hhdCBudW1iZXIgY29ycmVzcG9uZHMgdG8gd2hpY2ggYWRhcHRlci4KK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gcnVuICJpMmNkZXRlY3QgLWwiIHRvIG9idGFpbiBhIGZvcm1hdGVkIGxpc3Qgb2YgYWxsCitpMmMgYWRhcHRlcnMgcHJlc2VudCBvbiB5b3VyIHN5c3RlbSBhdCBhIGdpdmVuIHRpbWUuIGkyY2RldGVjdCBpcyBwYXJ0IG9mCit0aGUgaTJjLXRvb2xzIHBhY2thZ2UuCisKIEkyQyBkZXZpY2UgZmlsZXMgYXJlIGNoYXJhY3RlciBkZXZpY2UgZmlsZXMgd2l0aCBtYWpvciBkZXZpY2UgbnVtYmVyIDg5CiBhbmQgYSBtaW5vciBkZXZpY2UgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG51bWJlciBhc3NpZ25lZCBhcyAKIGV4cGxhaW5lZCBhYm92ZS4gVGhleSBzaG91bGQgYmUgY2FsbGVkICJpMmMtJWQiIChpMmMtMCwgaTJjLTEsIC4uLiwgCkBAIC0xNywzMCArMjEsMzQgQEAKIGZpcnN0IHRoaW5nIHRvIGRvIGlzICIjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPiIuIFBsZWFzZSBub3RlIHRoYXQKIHRoZXJlIGFyZSB0d28gZmlsZXMgbmFtZWQgImkyYy1kZXYuaCIgb3V0IHRoZXJlLCBvbmUgaXMgZGlzdHJpYnV0ZWQKIHdpdGggdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWVhbnQgdG8gYmUgaW5jbHVkZWQgZnJvbSBrZXJuZWwKLWRyaXZlciBjb2RlLCB0aGUgb3RoZXIgb25lIGlzIGRpc3RyaWJ1dGVkIHdpdGggbG1fc2Vuc29ycyBhbmQgaXMKK2RyaXZlciBjb2RlLCB0aGUgb3RoZXIgb25lIGlzIGRpc3RyaWJ1dGVkIHdpdGggaTJjLXRvb2xzIGFuZCBpcwogbWVhbnQgdG8gYmUgaW5jbHVkZWQgZnJvbSB1c2VyLXNwYWNlIHByb2dyYW1zLiBZb3Ugb2J2aW91c2x5IHdhbnQKIHRoZSBzZWNvbmQgb25lIGhlcmUuCiAKIE5vdywgeW91IGhhdmUgdG8gZGVjaWRlIHdoaWNoIGFkYXB0ZXIgeW91IHdhbnQgdG8gYWNjZXNzLiBZb3Ugc2hvdWxkCi1pbnNwZWN0IC9zeXMvY2xhc3MvaTJjLWRldi8gdG8gZGVjaWRlIHRoaXMuIEFkYXB0ZXIgbnVtYmVycyBhcmUgYXNzaWduZWQKLXNvbWV3aGF0IGR5bmFtaWNhbGx5LCBzbyB5b3UgY2FuIG5vdCBldmVuIGFzc3VtZSAvZGV2L2kyYy0wIGlzIHRoZQotZmlyc3QgYWRhcHRlci4KK2luc3BlY3QgL3N5cy9jbGFzcy9pMmMtZGV2LyBvciBydW4gImkyY2RldGVjdCAtbCIgdG8gZGVjaWRlIHRoaXMuCitBZGFwdGVyIG51bWJlcnMgYXJlIGFzc2lnbmVkIHNvbWV3aGF0IGR5bmFtaWNhbGx5LCBzbyB5b3UgY2FuIG5vdAorYXNzdW1lIG11Y2ggYWJvdXQgdGhlbS4gVGhleSBjYW4gZXZlbiBjaGFuZ2UgZnJvbSBvbmUgYm9vdCB0byB0aGUgbmV4dC4KIAogTmV4dCB0aGluZywgb3BlbiB0aGUgZGV2aWNlIGZpbGUsIGFzIGZvbGxvd3M6CisKICAgaW50IGZpbGU7CiAgIGludCBhZGFwdGVyX25yID0gMjsgLyogcHJvYmFibHkgZHluYW1pY2FsbHkgZGV0ZXJtaW5lZCAqLwogICBjaGFyIGZpbGVuYW1lWzIwXTsKICAgCi0gIHNwcmludGYoZmlsZW5hbWUsIi9kZXYvaTJjLSVkIixhZGFwdGVyX25yKTsKLSAgaWYgKChmaWxlID0gb3BlbihmaWxlbmFtZSxPX1JEV1IpKSA8IDApIHsKKyAgc25wcmludGYoZmlsZW5hbWUsIDE5LCAiL2Rldi9pMmMtJWQiLCBhZGFwdGVyX25yKTsKKyAgZmlsZSA9IG9wZW4oZmlsZW5hbWUsIE9fUkRXUik7CisgIGlmIChmaWxlIDwgMCkgewogICAgIC8qIEVSUk9SIEhBTkRMSU5HOyB5b3UgY2FuIGNoZWNrIGVycm5vIHRvIHNlZSB3aGF0IHdlbnQgd3JvbmcgKi8KICAgICBleGl0KDEpOwogICB9CiAKIFdoZW4geW91IGhhdmUgb3BlbmVkIHRoZSBkZXZpY2UsIHlvdSBtdXN0IHNwZWNpZnkgd2l0aCB3aGF0IGRldmljZQogYWRkcmVzcyB5b3Ugd2FudCB0byBjb21tdW5pY2F0ZToKKwogICBpbnQgYWRkciA9IDB4NDA7IC8qIFRoZSBJMkMgYWRkcmVzcyAqLwotICBpZiAoaW9jdGwoZmlsZSxJMkNfU0xBVkUsYWRkcikgPCAwKSB7CisKKyAgaWYgKGlvY3RsKGZpbGUsIEkyQ19TTEFWRSwgYWRkcikgPCAwKSB7CiAgICAgLyogRVJST1IgSEFORExJTkc7IHlvdSBjYW4gY2hlY2sgZXJybm8gdG8gc2VlIHdoYXQgd2VudCB3cm9uZyAqLwogICAgIGV4aXQoMSk7CiAgIH0KQEAgLTQ4LDMxICs1Niw0MSBAQAogV2VsbCwgeW91IGFyZSBhbGwgc2V0IHVwIG5vdy4gWW91IGNhbiBub3cgdXNlIFNNQnVzIGNvbW1hbmRzIG9yIHBsYWluCiBJMkMgdG8gY29tbXVuaWNhdGUgd2l0aCB5b3VyIGRldmljZS4gU01CdXMgY29tbWFuZHMgYXJlIHByZWZlcnJlZCBpZgogdGhlIGRldmljZSBzdXBwb3J0cyB0aGVtLiBCb3RoIGFyZSBpbGx1c3RyYXRlZCBiZWxvdy4KKwogICBfX3U4IHJlZ2lzdGVyID0gMHgxMDsgLyogRGV2aWNlIHJlZ2lzdGVyIHRvIGFjY2VzcyAqLwogICBfX3MzMiByZXM7CiAgIGNoYXIgYnVmWzEwXTsKKwogICAvKiBVc2luZyBTTUJ1cyBjb21tYW5kcyAqLwotICByZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoZmlsZSxyZWdpc3Rlcik7CisgIHJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShmaWxlLCByZWdpc3Rlcik7CiAgIGlmIChyZXMgPCAwKSB7CiAgICAgLyogRVJST1IgSEFORExJTkc6IGkyYyB0cmFuc2FjdGlvbiBmYWlsZWQgKi8KICAgfSBlbHNlIHsKICAgICAvKiByZXMgY29udGFpbnMgdGhlIHJlYWQgd29yZCAqLwogICB9CisKICAgLyogVXNpbmcgSTJDIFdyaXRlLCBlcXVpdmFsZW50IG9mIAotICAgICAgICAgICBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGZpbGUscmVnaXN0ZXIsMHg2NTQzKSAqLworICAgICBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGZpbGUsIHJlZ2lzdGVyLCAweDY1NDMpICovCiAgIGJ1ZlswXSA9IHJlZ2lzdGVyOwogICBidWZbMV0gPSAweDQzOwogICBidWZbMl0gPSAweDY1OwotICBpZiAoIHdyaXRlKGZpbGUsYnVmLDMpICE9IDMpIHsKKyAgaWYgKHdyaXRlKGZpbGUsIGJ1ZiwgMykgISA9MykgewogICAgIC8qIEVSUk9SIEhBTkRMSU5HOiBpMmMgdHJhbnNhY3Rpb24gZmFpbGVkICovCiAgIH0KKwogICAvKiBVc2luZyBJMkMgUmVhZCwgZXF1aXZhbGVudCBvZiBpMmNfc21idXNfcmVhZF9ieXRlKGZpbGUpICovCi0gIGlmIChyZWFkKGZpbGUsYnVmLDEpICE9IDEpIHsKKyAgaWYgKHJlYWQoZmlsZSwgYnVmLCAxKSAhPSAxKSB7CiAgICAgLyogRVJST1IgSEFORExJTkc6IGkyYyB0cmFuc2FjdGlvbiBmYWlsZWQgKi8KICAgfSBlbHNlIHsKICAgICAvKiBidWZbMF0gY29udGFpbnMgdGhlIHJlYWQgYnl0ZSAqLwogICB9CiAKK05vdGUgdGhhdCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBJMkMgYW5kIFNNQnVzIHByb3RvY29scyBjYW4gYmUgYWNoaWV2ZWQgYnkKK3RoZSBtZWFucyBvZiByZWFkKCkgYW5kIHdyaXRlKCkgY2FsbHMuIEluIHBhcnRpY3VsYXIsIHNvLWNhbGxlZCBjb21iaW5lZAordHJhbnNhY3Rpb25zIChtaXhpbmcgcmVhZCBhbmQgd3JpdGUgbWVzc2FnZXMgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24pCithcmVuJ3Qgc3VwcG9ydGVkLiBGb3IgdGhpcyByZWFzb24sIHRoaXMgaW50ZXJmYWNlIGlzIGFsbW9zdCBuZXZlciB1c2VkIGJ5Cit1c2VyLXNwYWNlIHByb2dyYW1zLgorCiBJTVBPUlRBTlQ6IGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiBpbmxpbmUgZnVuY3Rpb25zLCB5b3UgKmhhdmUqIHRvIHVzZQogJy1PJyBvciBzb21lIHZhcmlhdGlvbiB3aGVuIHlvdSBjb21waWxlIHlvdXIgcHJvZ3JhbSEKIApAQCAtODAsMzEgKzk4LDI5IEBACiBGdWxsIGludGVyZmFjZSBkZXNjcmlwdGlvbgogPT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIGZvbGxvd2luZyBJT0NUTHMgYXJlIGRlZmluZWQgYW5kIGZ1bGx5IHN1cHBvcnRlZCAKLShzZWUgYWxzbyBpMmMtZGV2LmgpOgorVGhlIGZvbGxvd2luZyBJT0NUTHMgYXJlIGRlZmluZWQ6CiAKLWlvY3RsKGZpbGUsSTJDX1NMQVZFLGxvbmcgYWRkcikKK2lvY3RsKGZpbGUsIEkyQ19TTEFWRSwgbG9uZyBhZGRyKQogICBDaGFuZ2Ugc2xhdmUgYWRkcmVzcy4gVGhlIGFkZHJlc3MgaXMgcGFzc2VkIGluIHRoZSA3IGxvd2VyIGJpdHMgb2YgdGhlCiAgIGFyZ3VtZW50IChleGNlcHQgZm9yIDEwIGJpdCBhZGRyZXNzZXMsIHBhc3NlZCBpbiB0aGUgMTAgbG93ZXIgYml0cyBpbiB0aGlzCiAgIGNhc2UpLgogCi1pb2N0bChmaWxlLEkyQ19URU5CSVQsbG9uZyBzZWxlY3QpCitpb2N0bChmaWxlLCBJMkNfVEVOQklULCBsb25nIHNlbGVjdCkKICAgU2VsZWN0cyB0ZW4gYml0IGFkZHJlc3NlcyBpZiBzZWxlY3Qgbm90IGVxdWFscyAwLCBzZWxlY3RzIG5vcm1hbCA3IGJpdAogICBhZGRyZXNzZXMgaWYgc2VsZWN0IGVxdWFscyAwLiBEZWZhdWx0IDAuICBUaGlzIHJlcXVlc3QgaXMgb25seSB2YWxpZAogICBpZiB0aGUgYWRhcHRlciBoYXMgSTJDX0ZVTkNfMTBCSVRfQUREUi4KIAotaW9jdGwoZmlsZSxJMkNfUEVDLGxvbmcgc2VsZWN0KQoraW9jdGwoZmlsZSwgSTJDX1BFQywgbG9uZyBzZWxlY3QpCiAgIFNlbGVjdHMgU01CdXMgUEVDIChwYWNrZXQgZXJyb3IgY2hlY2tpbmcpIGdlbmVyYXRpb24gYW5kIHZlcmlmaWNhdGlvbgogICBpZiBzZWxlY3Qgbm90IGVxdWFscyAwLCBkaXNhYmxlcyBpZiBzZWxlY3QgZXF1YWxzIDAuIERlZmF1bHQgMC4KICAgVXNlZCBvbmx5IGZvciBTTUJ1cyB0cmFuc2FjdGlvbnMuICBUaGlzIHJlcXVlc3Qgb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZQogICB0aGUgYWRhcHRlciBoYXMgSTJDX0ZVTkNfU01CVVNfUEVDOyBpdCBpcyBzdGlsbCBzYWZlIGlmIG5vdCwgaXQganVzdAogICBkb2Vzbid0IGhhdmUgYW55IGVmZmVjdC4KIAotaW9jdGwoZmlsZSxJMkNfRlVOQ1MsdW5zaWduZWQgbG9uZyAqZnVuY3MpCitpb2N0bChmaWxlLCBJMkNfRlVOQ1MsIHVuc2lnbmVkIGxvbmcgKmZ1bmNzKQogICBHZXRzIHRoZSBhZGFwdGVyIGZ1bmN0aW9uYWxpdHkgYW5kIHB1dHMgaXQgaW4gKmZ1bmNzLgogCi1pb2N0bChmaWxlLEkyQ19SRFdSLHN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhICptc2dzZXQpCi0KK2lvY3RsKGZpbGUsIEkyQ19SRFdSLCBzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YSAqbXNnc2V0KQogICBEbyBjb21iaW5lZCByZWFkL3dyaXRlIHRyYW5zYWN0aW9uIHdpdGhvdXQgc3RvcCBpbiBiZXR3ZWVuLgogICBPbmx5IHZhbGlkIGlmIHRoZSBhZGFwdGVyIGhhcyBJMkNfRlVOQ19JMkMuICBUaGUgYXJndW1lbnQgaXMKICAgYSBwb2ludGVyIHRvIGEKQEAgLTEyMCwxMCArMTM2LDkgQEAKICAgVGhlIHNsYXZlIGFkZHJlc3MgYW5kIHdoZXRoZXIgdG8gdXNlIHRlbiBiaXQgYWRkcmVzcyBtb2RlIGhhcyB0byBiZQogICBzZXQgaW4gZWFjaCBtZXNzYWdlLCBvdmVycmlkaW5nIHRoZSB2YWx1ZXMgc2V0IHdpdGggdGhlIGFib3ZlIGlvY3RsJ3MuCiAKLQotT3RoZXIgdmFsdWVzIGFyZSBOT1Qgc3VwcG9ydGVkIGF0IHRoaXMgbW9tZW50LCBleGNlcHQgZm9yIEkyQ19TTUJVUywKLXdoaWNoIHlvdSBzaG91bGQgbmV2ZXIgZGlyZWN0bHkgY2FsbDsgaW5zdGVhZCwgdXNlIHRoZSBhY2Nlc3MgZnVuY3Rpb25zCi1iZWxvdy4KK2lvY3RsKGZpbGUsIEkyQ19TTUJVUywgc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhICphcmdzKQorICBOb3QgbWVhbnQgdG8gYmUgY2FsbGVkICBkaXJlY3RseTsgaW5zdGVhZCwgdXNlIHRoZSBhY2Nlc3MgZnVuY3Rpb25zCisgIGJlbG93LgogCiBZb3UgY2FuIGRvIHBsYWluIGkyYyB0cmFuc2FjdGlvbnMgYnkgdXNpbmcgcmVhZCgyKSBhbmQgd3JpdGUoMikgY2FsbHMuCiBZb3UgZG8gbm90IG5lZWQgdG8gcGFzcyB0aGUgYWRkcmVzcyBieXRlOyBpbnN0ZWFkLCBzZXQgaXQgdGhyb3VnaApAQCAtMTQ4LDcgKzE2Myw1MiBAQAogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbHVlcyByZWFkLiBUaGUgYmxvY2sgYnVmZmVycyBuZWVkIG5vdCBiZSBsb25nZXIKIHRoYW4gMzIgYnl0ZXMuCiAKLVRoZSBhYm92ZSBmdW5jdGlvbnMgYXJlIGFsbCBtYWNyb3MsIHRoYXQgcmVzb2x2ZSB0byBjYWxscyB0byB0aGUKLWkyY19zbWJ1c19hY2Nlc3MgZnVuY3Rpb24sIHRoYXQgb24gaXRzIHR1cm4gY2FsbHMgYSBzcGVjaWZpYyBpb2N0bAorVGhlIGFib3ZlIGZ1bmN0aW9ucyBhcmUgYWxsIGlubGluZSBmdW5jdGlvbnMsIHRoYXQgcmVzb2x2ZSB0byBjYWxscyB0bwordGhlIGkyY19zbWJ1c19hY2Nlc3MgZnVuY3Rpb24sIHRoYXQgb24gaXRzIHR1cm4gY2FsbHMgYSBzcGVjaWZpYyBpb2N0bAogd2l0aCB0aGUgZGF0YSBpbiBhIHNwZWNpZmljIGZvcm1hdC4gUmVhZCB0aGUgc291cmNlIGNvZGUgaWYgeW91CiB3YW50IHRvIGtub3cgd2hhdCBoYXBwZW5zIGJlaGluZCB0aGUgc2NyZWVucy4KKworCitJbXBsZW1lbnRhdGlvbiBkZXRhaWxzCis9PT09PT09PT09PT09PT09PT09PT09CisKK0ZvciB0aGUgaW50ZXJlc3RlZCwgaGVyZSdzIHRoZSBjb2RlIGZsb3cgd2hpY2ggaGFwcGVucyBpbnNpZGUgdGhlIGtlcm5lbAord2hlbiB5b3UgdXNlIHRoZSAvZGV2IGludGVyZmFjZSB0byBJMkM6CisKKzEqIFlvdXIgcHJvZ3JhbSBvcGVucyAvZGV2L2kyYy1OIGFuZCBjYWxscyBpb2N0bCgpIG9uIGl0LCBhcyBkZXNjcmliZWQgaW4KK3NlY3Rpb24gIkMgZXhhbXBsZSIgYWJvdmUuCisKKzIqIFRoZXNlIG9wZW4oKSBhbmQgaW9jdGwoKSBjYWxscyBhcmUgaGFuZGxlZCBieSB0aGUgaTJjLWRldiBrZXJuZWwKK2RyaXZlcjogc2VlIGkyYy1kZXYuYzppMmNkZXZfb3BlbigpIGFuZCBpMmMtZGV2LmM6aTJjZGV2X2lvY3RsKCksCityZXNwZWN0aXZlbHkuIFlvdSBjYW4gdGhpbmsgb2YgaTJjLWRldiBhcyBhIGdlbmVyaWMgSTJDIGNoaXAgZHJpdmVyCit0aGF0IGNhbiBiZSBwcm9ncmFtbWVkIGZyb20gdXNlci1zcGFjZS4KKworMyogU29tZSBpb2N0bCgpIGNhbGxzIGFyZSBmb3IgYWRtaW5pc3RyYXRpdmUgdGFza3MgYW5kIGFyZSBoYW5kbGVkIGJ5CitpMmMtZGV2IGRpcmVjdGx5LiBFeGFtcGxlcyBpbmNsdWRlIEkyQ19TTEFWRSAoc2V0IHRoZSBhZGRyZXNzIG9mIHRoZQorZGV2aWNlIHlvdSB3YW50IHRvIGFjY2VzcykgYW5kIEkyQ19QRUMgKGVuYWJsZSBvciBkaXNhYmxlIFNNQnVzIGVycm9yCitjaGVja2luZyBvbiBmdXR1cmUgdHJhbnNhY3Rpb25zLikKKworNCogT3RoZXIgaW9jdGwoKSBjYWxscyBhcmUgY29udmVydGVkIHRvIGluLWtlcm5lbCBmdW5jdGlvbiBjYWxscyBieQoraTJjLWRldi4gRXhhbXBsZXMgaW5jbHVkZSBJMkNfRlVOQ1MsIHdoaWNoIHF1ZXJpZXMgdGhlIEkyQyBhZGFwdGVyCitmdW5jdGlvbmFsaXR5IHVzaW5nIGkyYy5oOmkyY19nZXRfZnVuY3Rpb25hbGl0eSgpLCBhbmQgSTJDX1NNQlVTLCB3aGljaAorcGVyZm9ybXMgYW4gU01CdXMgdHJhbnNhY3Rpb24gdXNpbmcgaTJjLWNvcmUuYzppMmNfc21idXNfeGZlcigpLgorCitUaGUgaTJjLWRldiBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGFsbCB0aGUgcGFyYW1ldGVycyB0aGF0Citjb21lIGZyb20gdXNlci1zcGFjZSBmb3IgdmFsaWRpdHkuIEFmdGVyIHRoaXMgcG9pbnQsIHRoZXJlIGlzIG5vCitkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgY2FsbHMgdGhhdCBjYW1lIGZyb20gdXNlci1zcGFjZSB0aHJvdWdoIGkyYy1kZXYKK2FuZCBjYWxscyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgYnkga2VybmVsIEkyQyBjaGlwIGRyaXZlcnMKK2RpcmVjdGx5LiBUaGlzIG1lYW5zIHRoYXQgSTJDIGJ1cyBkcml2ZXJzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50Cithbnl0aGluZyBzcGVjaWFsIHRvIHN1cHBvcnQgYWNjZXNzIGZyb20gdXNlci1zcGFjZS4KKworNSogVGhlc2UgaTJjLWNvcmUuYy9pMmMuaCBmdW5jdGlvbnMgYXJlIHdyYXBwZXJzIHRvIHRoZSBhY3R1YWwKK2ltcGxlbWVudGF0aW9uIG9mIHlvdXIgSTJDIGJ1cyBkcml2ZXIuIEVhY2ggYWRhcHRlciBtdXN0IGRlY2xhcmUKK2NhbGxiYWNrIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgdGhlc2Ugc3RhbmRhcmQgY2FsbHMuCitpMmMuaDppMmNfZ2V0X2Z1bmN0aW9uYWxpdHkoKSBjYWxscyBpMmNfYWRhcHRlci5hbGdvLT5mdW5jdGlvbmFsaXR5KCksCit3aGlsZSBpMmMtY29yZS5jOmkyY19zbWJ1c194ZmVyKCkgY2FsbHMgZWl0aGVyCithZGFwdGVyLmFsZ28tPnNtYnVzX3hmZXIoKSBpZiBpdCBpcyBpbXBsZW1lbnRlZCwgb3IgaWYgbm90LAoraTJjLWNvcmUuYzppMmNfc21idXNfeGZlcl9lbXVsYXRlZCgpIHdoaWNoIGluIHR1cm4gY2FsbHMKK2kyY19hZGFwdGVyLmFsZ28tPm1hc3Rlcl94ZmVyKCkuCisKK0FmdGVyIHlvdXIgSTJDIGJ1cyBkcml2ZXIgaGFzIHByb2Nlc3NlZCB0aGVzZSByZXF1ZXN0cywgZXhlY3V0aW9uIHJ1bnMKK3VwIHRoZSBjYWxsIGNoYWluLCB3aXRoIGFsbW9zdCBubyBwcm9jZXNzaW5nIGRvbmUsIGV4Y2VwdCBieSBpMmMtZGV2IHRvCitwYWNrYWdlIHRoZSByZXR1cm5lZCBkYXRhLCBpZiBhbnksIGluIHN1aXRhYmxlIGZvcm1hdCBmb3IgdGhlIGlvY3RsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wgYi9Eb2N1bWVudGF0aW9uL2kyYy9zbWJ1cy1wcm90b2NvbAppbmRleCAyNGJmYjY1ZC4uOWRmNDc0NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKQEAgLTEwOSw4ICsxMDksOCBAQAogUyBBZGRyIFdyIFtBXSBDb21tIFtBXSBEYXRhTG93IFtBXSBEYXRhSGlnaCBbQV0gUAogCiAKLVNNQnVzIFByb2Nlc3MgQ2FsbAotPT09PT09PT09PT09PT09PT09CitTTUJ1cyBQcm9jZXNzIENhbGw6ICBpMmNfc21idXNfcHJvY2Vzc19jYWxsKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGNvbW1hbmQgc2VsZWN0cyBhIGRldmljZSByZWdpc3RlciAodGhyb3VnaCB0aGUgQ29tbSBieXRlKSwgc2VuZHMKIDE2IGJpdHMgb2YgZGF0YSB0byBpdCwgYW5kIHJlYWRzIDE2IGJpdHMgb2YgZGF0YSBpbiByZXR1cm4uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMgYi9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMKaW5kZXggNmI2MWIzYS4uZDczZWUxMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cwpAQCAtNjA2LDYgKzYwNiw4IEBACiAgIGV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LCB1OCBjb21tYW5kKTsKICAgZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgdTE2IHZhbHVlKTsKKyAgZXh0ZXJuIHMzMiBpMmNfc21idXNfcHJvY2Vzc19jYWxsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCB1MTYgdmFsdWUpOwogICBleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCB1OCAqdmFsdWVzKTsKICAgZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwKQEAgLTYyMSw4ICs2MjMsNiBAQAogYmUgYWRkZWQgYmFjayBsYXRlciBpZiBuZWVkZWQ6CiAKICAgZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfcXVpY2soc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsIHU4IHZhbHVlKTsKLSAgZXh0ZXJuIHMzMiBpMmNfc21idXNfcHJvY2Vzc19jYWxsKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgdTE2IHZhbHVlKTsKICAgZXh0ZXJuIHMzMiBpMmNfc21idXNfYmxvY2tfcHJvY2Vzc19jYWxsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCB1OCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqdmFsdWVzKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvbWFjaGluZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dAppbmRleCBjOWEzNTY2Li5jZTM0ODdkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dApAQCAtMiwxNyArMiw4IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGUgcmVndWxhdG9yIG1hY2hpbmUgZHJpdmVyIGludGVyZmFjZSBpcyBpbnRlbmRlZCBmb3IgYm9hcmQvbWFjaGluZSBzcGVjaWZpYwotaW5pdGlhbGlzYXRpb24gY29kZSB0byBjb25maWd1cmUgdGhlIHJlZ3VsYXRvciBzdWJzeXN0ZW0uIFR5cGljYWwgdGhpbmdzIHRoYXQKLW1hY2hpbmUgZHJpdmVycyB3b3VsZCBkbyBhcmUgOi0KK2luaXRpYWxpc2F0aW9uIGNvZGUgdG8gY29uZmlndXJlIHRoZSByZWd1bGF0b3Igc3Vic3lzdGVtLgogCi0gMS4gUmVndWxhdG9yIC0+IERldmljZSBtYXBwaW5nLgotIDIuIFJlZ3VsYXRvciBzdXBwbHkgY29uZmlndXJhdGlvbi4KLSAzLiBQb3dlciBEb21haW4gY29uc3RyYWludCBzZXR0aW5nLgotCi0KLQotMS4gUmVndWxhdG9yIC0+IGRldmljZSBtYXBwaW5nCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWFjaGluZSA6LQogCiAgIFJlZ3VsYXRvci0xIC0rLT4gUmVndWxhdG9yLTIgLS0+IFtDb25zdW1lciBBIEAgMS44IC0gMi4wVl0KQEAgLTIxLDgxICsxMiw4MiBAQAogCiBUaGUgZHJpdmVycyBmb3IgY29uc3VtZXJzIEEgJiBCIG11c3QgYmUgbWFwcGVkIHRvIHRoZSBjb3JyZWN0IHJlZ3VsYXRvciBpbgogb3JkZXIgdG8gY29udHJvbCB0aGVpciBwb3dlciBzdXBwbHkuIFRoaXMgbWFwcGluZyBjYW4gYmUgYWNoaWV2ZWQgaW4gbWFjaGluZQotaW5pdGlhbGlzYXRpb24gY29kZSBieSBjYWxsaW5nIDotCitpbml0aWFsaXNhdGlvbiBjb2RlIGJ5IGNyZWF0aW5nIGEgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZm9yCitlYWNoIHJlZ3VsYXRvci4KIAotaW50IHJlZ3VsYXRvcl9zZXRfZGV2aWNlX3N1cHBseShjb25zdCBjaGFyICpyZWd1bGF0b3IsIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQljb25zdCBjaGFyICpzdXBwbHkpOworc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgeworCXN0cnVjdCBkZXZpY2UgKmRldjsJLyogY29uc3VtZXIgKi8KKwljb25zdCBjaGFyICpzdXBwbHk7CS8qIGNvbnN1bWVyIHN1cHBseSAtIGUuZy4gInZjYyIgKi8KK307CiAKLWFuZCBpcyBzaG93biB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZSA6LQorZS5nLiBmb3IgdGhlIG1hY2hpbmUgYWJvdmUKIAotcmVndWxhdG9yX3NldF9kZXZpY2Vfc3VwcGx5KCJSZWd1bGF0b3ItMSIsIGRldkIsICJWY2MiKTsKLXJlZ3VsYXRvcl9zZXRfZGV2aWNlX3N1cHBseSgiUmVndWxhdG9yLTIiLCBkZXZBLCAiVmNjIik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcmVndWxhdG9yMV9jb25zdW1lcnNbXSA9IHsKK3sKKwkuZGV2CT0gJnBsYXRmb3JtX2NvbnN1bWVyQl9kZXZpY2UuZGV2LAorCS5zdXBwbHkJPSAiVmNjIiwKK30sfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJlZ3VsYXRvcjJfY29uc3VtZXJzW10gPSB7Cit7CisJLmRldgk9ICZwbGF0Zm9ybV9jb25zdW1lckFfZGV2aWNlLmRldiwKKwkuc3VwcGx5CT0gIlZjYyIsCit9LH07CiAKIFRoaXMgbWFwcyBSZWd1bGF0b3ItMSB0byB0aGUgJ1ZjYycgc3VwcGx5IGZvciBDb25zdW1lciBCIGFuZCBtYXBzIFJlZ3VsYXRvci0yCiB0byB0aGUgJ1ZjYycgc3VwcGx5IGZvciBDb25zdW1lciBBLgogCitDb25zdHJhaW50cyBjYW4gbm93IGJlIHJlZ2lzdGVyZWQgYnkgZGVmaW5pbmcgYSBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQorZm9yIGVhY2ggcmVndWxhdG9yIHBvd2VyIGRvbWFpbi4gVGhpcyBzdHJ1Y3R1cmUgYWxzbyBtYXBzIHRoZSBjb25zdW1lcnMKK3RvIHRoZWlyIHN1cHBseSByZWd1bGF0b3IgOi0KIAotMi4gUmVndWxhdG9yIHN1cHBseSBjb25maWd1cmF0aW9uLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBtYWNoaW5lIChhZ2FpbikgOi0KLQotICBSZWd1bGF0b3ItMSAtKy0+IFJlZ3VsYXRvci0yIC0tPiBbQ29uc3VtZXIgQSBAIDEuOCAtIDIuMFZdCi0gICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICArLT4gW0NvbnN1bWVyIEIgQCAzLjNWXQorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJlZ3VsYXRvcjFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYgPSAzMzAwMDAwLAorCQkubWF4X3VWID0gMzMwMDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShyZWd1bGF0b3IxX2NvbnN1bWVycyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gcmVndWxhdG9yMV9jb25zdW1lcnMsCit9OwogCiBSZWd1bGF0b3ItMSBzdXBwbGllcyBwb3dlciB0byBSZWd1bGF0b3ItMi4gVGhpcyByZWxhdGlvbnNoaXAgbXVzdCBiZSByZWdpc3RlcmVkCiB3aXRoIHRoZSBjb3JlIHNvIHRoYXQgUmVndWxhdG9yLTEgaXMgYWxzbyBlbmFibGVkIHdoZW4gQ29uc3VtZXIgQSBlbmFibGVzIGl0J3MKLXN1cHBseSAoUmVndWxhdG9yLTIpLgorc3VwcGx5IChSZWd1bGF0b3ItMikuIFRoZSBzdXBwbHkgcmVndWxhdG9yIGlzIHNldCBieSB0aGUgc3VwcGx5X3JlZ3VsYXRvcl9kZXYKK2ZpZWxkIGJlbG93Oi0KIAotVGhpcyByZWxhdGlvbnNoaXAgY2FuIGJlIHJlZ2lzdGVyIHdpdGggdGhlIGNvcmUgdmlhIDotCi0KLWludCByZWd1bGF0b3Jfc2V0X3N1cHBseShjb25zdCBjaGFyICpyZWd1bGF0b3IsIGNvbnN0IGNoYXIgKnJlZ3VsYXRvcl9zdXBwbHkpOwotCi1JbiB0aGlzIGV4YW1wbGUgd2Ugd291bGQgdXNlIHRoZSBmb2xsb3dpbmcgY29kZSA6LQotCi1yZWd1bGF0b3Jfc2V0X3N1cHBseSgiUmVndWxhdG9yLTIiLCAiUmVndWxhdG9yLTEiKTsKLQotUmVsYXRpb25zaGlwcyBjYW4gYmUgcXVlcmllZCBieSBjYWxsaW5nIDotCi0KLWNvbnN0IGNoYXIgKnJlZ3VsYXRvcl9nZXRfc3VwcGx5KGNvbnN0IGNoYXIgKnJlZ3VsYXRvcik7Ci0KLQotMy4gUG93ZXIgRG9tYWluIGNvbnN0cmFpbnQgc2V0dGluZy4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1FYWNoIHBvd2VyIGRvbWFpbiB3aXRoaW4gYSBzeXN0ZW0gaGFzIHBoeXNpY2FsIGNvbnN0cmFpbnRzIG9uIHZvbHRhZ2UgYW5kCi1jdXJyZW50LiBUaGlzIG11c3QgYmUgZGVmaW5lZCBpbiBzb2Z0d2FyZSBzbyB0aGF0IHRoZSBwb3dlciBkb21haW4gaXMgYWx3YXlzCi1vcGVyYXRlZCB3aXRoaW4gc3BlY2lmaWNhdGlvbnMuCi0KLUNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWFjaGluZSAoYWdhaW4pIDotCi0KLSAgUmVndWxhdG9yLTEgLSstPiBSZWd1bGF0b3ItMiAtLT4gW0NvbnN1bWVyIEEgQCAxLjggLSAyLjBWXQotICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgKy0+IFtDb25zdW1lciBCIEAgMy4zVl0KLQotVGhpcyBnaXZlcyB1cyB0d28gcmVndWxhdG9ycyBhbmQgdHdvIHBvd2VyIGRvbWFpbnM6Ci0KLSAgICAgICAgICAgICAgICAgICBEb21haW4gMTogUmVndWxhdG9yLTIsIENvbnN1bWVyIEIuCi0gICAgICAgICAgICAgICAgICAgRG9tYWluIDI6IENvbnN1bWVyIEEuCi0KLUNvbnN0cmFpbnRzIGNhbiBiZSByZWdpc3RlcmVkIGJ5IGNhbGxpbmcgOi0KLQotaW50IHJlZ3VsYXRvcl9zZXRfcGxhdGZvcm1fY29uc3RyYWludHMoY29uc3QgY2hhciAqcmVndWxhdG9yLAotCXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzICpjb25zdHJhaW50cyk7Ci0KLVRoZSBleGFtcGxlIGlzIGRlZmluZWQgYXMgZm9sbG93cyA6LQotCi1zdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyBkb21haW5fMSA9IHsKLQkubWluX3VWID0gMzMwMDAwMCwKLQkubWF4X3VWID0gMzMwMDAwMCwKLQkudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCwKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByZWd1bGF0b3IyX2RhdGEgPSB7CisJLnN1cHBseV9yZWd1bGF0b3JfZGV2ID0gJnBsYXRmb3JtX3JlZ3VsYXRvcjFfZGV2aWNlLmRldiwKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYgPSAxODAwMDAwLAorCQkubWF4X3VWID0gMjAwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFLAorCQkudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHJlZ3VsYXRvcjJfY29uc3VtZXJzKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSByZWd1bGF0b3IyX2NvbnN1bWVycywKIH07CiAKLXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzIGRvbWFpbl8yID0gewotCS5taW5fdVYgPSAxODAwMDAwLAotCS5tYXhfdVYgPSAyMDAwMDAwLAotCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKLQkudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCwKLX07CitGaW5hbGx5IHRoZSByZWd1bGF0b3IgZGV2aWNlcyBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHVzdWFsIG1hbm5lci4KIAotcmVndWxhdG9yX3NldF9wbGF0Zm9ybV9jb25zdHJhaW50cygiUmVndWxhdG9yLTEiLCAmZG9tYWluXzEpOwotcmVndWxhdG9yX3NldF9wbGF0Zm9ybV9jb25zdHJhaW50cygiUmVndWxhdG9yLTIiLCAmZG9tYWluXzIpOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmVndWxhdG9yX2RldmljZXNbXSA9IHsKK3sKKwkubmFtZSA9ICJyZWd1bGF0b3IiLAorCS5pZCA9IERDRENfMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZyZWd1bGF0b3IxX2RhdGEsCisJfSwKK30sCit7CisJLm5hbWUgPSAicmVndWxhdG9yIiwKKwkuaWQgPSBEQ0RDXzIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcmVndWxhdG9yMl9kYXRhLAorCX0sCit9LAorfTsKKy8qIHJlZ2lzdGVyIHJlZ3VsYXRvciAxIGRldmljZSAqLworcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ3bTgzNTBfcmVndWxhdG9yX2RldmljZXNbMF0pOworCisvKiByZWdpc3RlciByZWd1bGF0b3IgMiBkZXZpY2UgKi8KK3BsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmd204MzUwX3JlZ3VsYXRvcl9kZXZpY2VzWzFdKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CmluZGV4IGE2OTA1MDEuLjQyMDBhY2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dApAQCAtMTAsMTEgKzEwLDExIEBACiAKIERyaXZlcnMgY2FuIHJlZ2lzdGVyIGEgcmVndWxhdG9yIGJ5IGNhbGxpbmcgOi0KIAotc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcl9yZWdpc3RlcihzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKnJlZ3VsYXRvcl9kZXNjLAotCQkJCQkgIHZvaWQgKnJlZ19kYXRhKTsKK3N0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3JfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmVndWxhdG9yX2Rlc2MpOwogCi1UaGlzIHdpbGwgcmVnaXN0ZXIgdGhlIHJlZ3VsYXRvcnMgY2FwYWJpbGl0aWVzIGFuZCBvcGVyYXRpb25zIHRoZSByZWd1bGF0b3IKLWNvcmUuIFRoZSBjb3JlIGRvZXMgbm90IHRvdWNoIHJlZ19kYXRhIChwcml2YXRlIHRvIHJlZ3VsYXRvciBkcml2ZXIpLgorVGhpcyB3aWxsIHJlZ2lzdGVyIHRoZSByZWd1bGF0b3JzIGNhcGFiaWxpdGllcyBhbmQgb3BlcmF0aW9ucyB0byB0aGUgcmVndWxhdG9yCitjb3JlLgogCiBSZWd1bGF0b3JzIGNhbiBiZSB1bnJlZ2lzdGVyZWQgYnkgY2FsbGluZyA6LQogCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDk4OGIwYTguLjVkMGI4YTIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC00NTIwLDEwICs0NTIwLDExIEBACiAKIFZPTFRBR0UgQU5EIENVUlJFTlQgUkVHVUxBVE9SIEZSQU1FV09SSwogUDoJTGlhbSBHaXJkd29vZAotTToJbGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tCitNOglscmdAc2xpbWxvZ2ljLmNvLnVrCiBQOglNYXJrIEJyb3duCiBNOglicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbQogVzoJaHR0cDovL29wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbS9ub2RlLzE1CitXOglodHRwOi8vd3d3LnNsaW1sb2dpYy5jby51ay8/cGFnZV9pZD01CiBUOglnaXQga2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbHJnL3ZvbHRhZ2UtMi42LmdpdAogUzoJU3VwcG9ydGVkCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwppbmRleCAyY2VkNmQ5Li5hZGZjZDdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCkBAIC00NzYsNiArNDc2LDEwIEBACiAJCUkyQ19CT0FSRF9JTkZPKCJ0cHM2NTAxMyIsIDB4NDgpLAogICAgICAgICAgICAgICAgLyogLmlycSAgICAgICAgID0gT01BUF9HUElPX0lSUSg/PyksICovCiAgICAgICAgfSwKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJpc3AxMzAxX29tYXAiLCAweDJkKSwKKwkJLmlycQkJPSBPTUFQX0dQSU9fSVJRKDE0KSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2dwaW9fc3dpdGNoIGgzX2dwaW9fc3dpdGNoZXNbXSBfX2luaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCmluZGV4IGQ0ZTNiNmYuLjJmZWYyYzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KQEAgLTM5MSw2ICszOTIsMTMgQEAKIAl7IE9NQVBfVEFHX0xDRCwJCSZoNF9sY2RfY29uZmlnIH0sCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgaDRfaTJjX2JvYXJkX2luZm9bXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJpc3AxMzAxX29tYXAiLCAweDJkKSwKKwkJLmlycQkJPSBPTUFQX0dQSU9fSVJRKDEyNSksCisJfSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2g0X2luaXQodm9pZCkKIHsKIAkvKgpAQCAtNDExLDYgKzQxOSw5IEBACiAJfQogI2VuZGlmCiAKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBoNF9pMmNfYm9hcmRfaW5mbywKKwkJCUFSUkFZX1NJWkUoaDRfaTJjX2JvYXJkX2luZm8pKTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGg0X2RldmljZXMsIEFSUkFZX1NJWkUoaDRfZGV2aWNlcykpOwogCW9tYXBfYm9hcmRfY29uZmlnID0gaDRfY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGg0X2NvbmZpZyk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMgYi9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMKaW5kZXggY2JjM2M0Yy4uN2RhZjg5NyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvbTMyci9tbS9kaXNjb250aWcuYwpAQCAtMTExLDkgKzExMSw5IEBACiAJCQkJaW5pdHJkX3N0YXJ0LCBJTklUUkRfU0laRSk7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoImluaXRyZCBleHRlbmRzIGJleW9uZCBlbmQgb2YgbWVtb3J5ICIKLQkJCQkiKDB4JTA4bHggPiAweCUwOGx4KVxuZGlzYWJsaW5nIGluaXRyZFxuIiwKKwkJCQkiKDB4JTA4bHggPiAweCUwOGxseClcbmRpc2FibGluZyBpbml0cmRcbiIsCiAJCQkJSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUsCi0JCQkJUEZOX1BIWVMobWF4X2xvd19wZm4pKTsKKwkJCSAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylQRk5fUEhZUyhtYXhfbG93X3BmbikpOwogCiAJCQlpbml0cmRfc3RhcnQgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDQxZTViZjAuLjY3N2M5M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC0xMDUsMjEgKzEwNSw5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZXMsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBwY21jaWFfY29yZSBhbmQgZHMuCiAKLWNvbmZpZyBTVU4zCi0JYm9vbCAiU3VuMyBzdXBwb3J0IgotCXNlbGVjdCBNNjgwMjAKLQlzZWxlY3QgTU1VX1NVTjMgaWYgTU1VCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU3VuIDMgc2VyaWVzIG9mIHdvcmtzdGF0aW9ucwotCSAgKDMvNTAsIDMvNjAsIDMvMXh4LCAzLzJ4eCBzeXN0ZW1zKS4gRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVxdWlyZXMKLQkgIHRoYXQgYWxsIG90aGVyIGhhcmR3YXJlIHR5cGVzIG11c3QgYmUgZGlzYWJsZWQsIGFzIFN1biAzIGtlcm5lbHMKLQkgIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbTY4ayB0YXJnZXRzIChpbmNsdWRpbmcgU3VuIDN4ISkuCi0KLQkgIElmIHlvdSBkb24ndCB3YW50IHRvIGNvbXBpbGUgYSBrZXJuZWwgZXhjbHVzaXZlbHkgZm9yIGEgU3VuIDMsIHNheSBOLgotCiBjb25maWcgQU1JR0EKIAlib29sICJBbWlnYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBbWlnYSBzZXJpZXMgb2YgY29tcHV0ZXJzLiBJZgogCSAgeW91IHBsYW4gdG8gdXNlIHRoaXMga2VybmVsIG9uIGFuIEFtaWdhLCBzYXkgWSBoZXJlIGFuZCBicm93c2UgdGhlCkBAIC0xMjcsMzMgKzExNSwxNiBAQAogCiBjb25maWcgQVRBUkkKIAlib29sICJBdGFyaSBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSA2ODAwMC1iYXNlZCBBdGFyaSBzZXJpZXMgb2YKIAkgIGNvbXB1dGVycyAoaW5jbHVkaW5nIHRoZSBUVCwgRmFsY29uIGFuZCBNZWR1c2EpLiBJZiB5b3UgcGxhbiB0byB1c2UKIAkgIHRoaXMga2VybmVsIG9uIGFuIEF0YXJpLCBzYXkgWSBoZXJlIGFuZCBicm93c2UgdGhlIG1hdGVyaWFsCiAJICBhdmFpbGFibGUgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9tNjhrPjsgb3RoZXJ3aXNlIHNheSBOLgogCi1jb25maWcgSEFERVMKLQlib29sICJIYWRlcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVRBUkkgJiYgQlJPS0VOCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSGFkZXMgQXRhcmkgY2xvbmUuIElmIHlvdSBwbGFuCi0JICB0byB1c2UgdGhpcyBrZXJuZWwgb24gYSBIYWRlcywgc2F5IFkgaGVyZTsgb3RoZXJ3aXNlIHNheSBOLgotCi1jb25maWcgUENJCi0JYm9vbAotCWRlcGVuZHMgb24gSEFERVMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBGaW5kIG91dCB3aGV0aGVyIHlvdSBoYXZlIGEgUENJIG1vdGhlcmJvYXJkLiBQQ0kgaXMgdGhlIG5hbWUgb2YgYQotCSAgYnVzIHN5c3RlbSwgaS5lLiB0aGUgd2F5IHRoZSBDUFUgdGFsa3MgdG8gdGhlIG90aGVyIHN0dWZmIGluc2lkZQotCSAgeW91ciBib3guIE90aGVyIGJ1cyBzeXN0ZW1zIGFyZSBJU0EsIEVJU0EsIE1pY3JvQ2hhbm5lbCAoTUNBKSBvcgotCSAgVkVTQS4gSWYgeW91IGhhdmUgUENJLCBzYXkgWSwgb3RoZXJ3aXNlIE4uCi0KIGNvbmZpZyBNQUMKIAlib29sICJNYWNpbnRvc2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFNTVVfU1VOMworCXNlbGVjdCBNTVVfTU9UT1JPTEEgaWYgTU1VCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQXBwbGUgTWFjaW50b3NoIHNlcmllcyBvZgogCSAgY29tcHV0ZXJzICh5ZXMsIHRoZXJlIGlzIGV4cGVyaW1lbnRhbCBzdXBwb3J0IG5vdywgYXQgbGVhc3QgZm9yIHBhcnQKQEAgLTE3NCwxNCArMTQ1LDE0IEBACiAKIGNvbmZpZyBBUE9MTE8KIAlib29sICJBcG9sbG8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFNTVVfU1VOMworCXNlbGVjdCBNTVVfTU9UT1JPTEEgaWYgTU1VCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBydW4gTGludXggb24gYW4gTUM2ODB4MC1iYXNlZCBBcG9sbG8KIAkgIERvbWFpbiB3b3Jrc3RhdGlvbiBzdWNoIGFzIHRoZSBETjM1MDAuCiAKIGNvbmZpZyBWTUUKIAlib29sICJWTUUgKE1vdG9yb2xhIGFuZCBCVk0pIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhTU1VX1NVTjMKKwlzZWxlY3QgTU1VX01PVE9ST0xBIGlmIE1NVQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBrZXJuZWwgZm9yIGEgNjgweDAgYmFzZWQgVk1FCiAJICBib2FyZC4gIEJvYXJkcyBjdXJyZW50bHkgc3VwcG9ydGVkIGluY2x1ZGUgTW90b3JvbGEgYm9hcmRzIE1WTUUxNDcsCkBAIC0yMTgsNyArMTg5LDcgQEAKIAogY29uZmlnIEhQMzAwCiAJYm9vbCAiSFA5MDAwLzMwMCBhbmQgSFA5MDAwLzQwMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBIUDkwMDAvMzAwIGFuZCBIUDkwMDAvNDAwIHNlcmllcwogCSAgb2Ygd29ya3N0YXRpb25zLiBTdXBwb3J0IGZvciB0aGVzZSBtYWNoaW5lcyBpcyBzdGlsbCBzb21ld2hhdApAQCAtMjM3LDcgKzIwOCw3IEBACiAKIGNvbmZpZyBTVU4zWAogCWJvb2wgIlN1bjN4IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhTU1VX1NVTjMKKwlzZWxlY3QgTU1VX01PVE9ST0xBIGlmIE1NVQogCXNlbGVjdCBNNjgwMzAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTdW4gM3ggc2VyaWVzIG9mIHdvcmtzdGF0aW9ucy4KQEAgLTI1MCw3ICsyMjEsNyBAQAogCiBjb25maWcgUTQwCiAJYm9vbCAiUTQwL1E2MCBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGUgUTQwIGlzIGEgTW90b3JvbGEgNjgwNDAtYmFzZWQgc3VjY2Vzc29yIHRvIHRoZSBTaW5jbGFpciBRTAogCSAgbWFudWZhY3R1cmVkIGluIEdlcm1hbnkuICBUaGVyZSBpcyBhbiBvZmZpY2lhbCBRNDAgaG9tZSBwYWdlIGF0CkBAIC0yNTgsNiArMjI5LDE5IEBACiAJICBRNjAuIFNlbGVjdCB5b3VyIENQVSBiZWxvdy4gIEZvciA2OExDMDYwIGRvbid0IGZvcmdldCB0byBlbmFibGUgRlBVCiAJICBlbXVsYXRpb24uCiAKK2NvbmZpZyBTVU4zCisJYm9vbCAiU3VuMyBzdXBwb3J0IgorCWRlcGVuZHMgb24gIU1NVV9NT1RPUk9MQQorCXNlbGVjdCBNTVVfU1VOMyBpZiBNTVUKKwlzZWxlY3QgTTY4MDIwCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU3VuIDMgc2VyaWVzIG9mIHdvcmtzdGF0aW9ucworCSAgKDMvNTAsIDMvNjAsIDMvMXh4LCAzLzJ4eCBzeXN0ZW1zKS4gRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVxdWlyZXMKKwkgIHRoYXQgYWxsIG90aGVyIGhhcmR3YXJlIHR5cGVzIG11c3QgYmUgZGlzYWJsZWQsIGFzIFN1biAzIGtlcm5lbHMKKwkgIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbTY4ayB0YXJnZXRzIChpbmNsdWRpbmcgU3VuIDN4ISkuCisKKwkgIElmIHlvdSBkb24ndCB3YW50IHRvIGNvbXBpbGUgYSBrZXJuZWwgZXhjbHVzaXZlbHkgZm9yIGEgU3VuIDMsIHNheSBOLgorCiBjb21tZW50ICJQcm9jZXNzb3IgdHlwZSIKIAogY29uZmlnIE02ODAyMApAQCAtMjk1LDEwICsyNzksMTAgQEAKIGNvbmZpZyBNTVVfTU9UT1JPTEEKIAlib29sCiAJZGVwZW5kcyBvbiBNTVUgJiYgIU1NVV9TVU4zCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBNTVVfU1VOMwogCWJvb2wKKwlkZXBlbmRzIG9uIE1NVSAmJiAhTU1VX01PVE9ST0xBCiAKIGNvbmZpZyBNNjhLRlBVX0VNVQogCWJvb2wgIk1hdGggZW11bGF0aW9uIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKaW5kZXggZGY2NzlkOS4uMGEzZjllOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtOTg0LDMgKzk4NSwxMSBAQAogCiAJcmV0dXJuIGxlbjsKIH0KKworLyoKKyAqIFRoZSBBbWlnYSBrZXlib2FyZCBkcml2ZXIgbmVlZHMga2V5X21hcHMsIGJ1dCB3ZSBjYW5ub3QgZXhwb3J0IGl0IGluCisgKiBkcml2ZXJzL2NoYXIvZGVma2V5bWFwLmMsIGFzIGl0IGlzIGF1dG9nZW5lcmF0ZWQKKyAqLworI2lmZGVmIENPTkZJR19IV19DT05TT0xFCitFWFBPUlRfU1lNQk9MX0dQTChrZXlfbWFwcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9NYWtlZmlsZSBiL2FyY2gvbTY4ay9hdGFyaS9NYWtlZmlsZQppbmRleCAyY2Q5MDVlLi4wY2FjNzIzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2F0YXJpL01ha2VmaWxlCkBAIC01LDcgKzUsNCBAQAogb2JqLXkJCTo9IGNvbmZpZy5vIHRpbWUubyBkZWJ1Zy5vIGF0YWludHMubyBzdGRtYS5vIFwKIAkJCWF0YXNvdW5kLm8gc3RyYW0ubwogCi1pZmVxICgkKENPTkZJR19QQ0kpLHkpCi1vYmotJChDT05GSUdfSEFERVMpCSs9IGhhZGVzLXBjaS5vCi1lbmRpZgogb2JqLSQoQ09ORklHX0FUQVJJX0tCRF9DT1JFKQkrPSBhdGFrZXliLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMgYi9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCmluZGV4IGI0NTU5M2EuLmRiYTRhZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYwpAQCAtNDA3LDEwICs0MDcsOCBAQAogCQkgKiBnZXRzIG92ZXJydW5zKQogCQkgKi8KIAotCQlpZiAoIU1BQ0hfSVNfSEFERVMpIHsKLQkJCXZlY3RvcnNbVkVDX0lOVDJdID0gZmFsY29uX2hibGhhbmRsZXI7Ci0JCQl2ZWN0b3JzW1ZFQ19JTlQ0XSA9IGZhbGNvbl9oYmxoYW5kbGVyOwotCQl9CisJCXZlY3RvcnNbVkVDX0lOVDJdID0gZmFsY29uX2hibGhhbmRsZXI7CisJCXZlY3RvcnNbVkVDX0lOVDRdID0gZmFsY29uX2hibGhhbmRsZXI7CiAJfQogCiAJaWYgKEFUQVJJSFdfUFJFU0VOVChQQ01fOEJJVCkgJiYgQVRBUklIV19QUkVTRU5UKE1JQ1JPV0lSRSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9hdGFrZXliLmMgYi9hcmNoL202OGsvYXRhcmkvYXRha2V5Yi5jCmluZGV4IGJiOTU5ZmIuLmMwMzhiN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9hdGFrZXliLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWtleWIuYwpAQCAtNjM1LDE1ICs2MzUsMyBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXRhcmlfa2V5Yl9pbml0KTsKLQotaW50IGF0YXJpX2tiZF90cmFuc2xhdGUodW5zaWduZWQgY2hhciBrZXljb2RlLCB1bnNpZ25lZCBjaGFyICprZXljb2RlcCwgY2hhciByYXdfbW9kZSkKLXsKLSNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLQkvKiBBTFQrSEVMUCBwcmVzc2VkPyAqLwotCWlmICgoa2V5Y29kZSA9PSA5OCkgJiYgKChzaGlmdF9zdGF0ZSAmIDB4ZmYpID09IDgpKQotCQkqa2V5Y29kZXAgPSAweGZmOwotCWVsc2UKLSNlbmRpZgotCQkqa2V5Y29kZXAgPSBrZXljb2RlOwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jCmluZGV4IDU5NDVlMTUuLmFmMDMxODUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYworKysgYi9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCSAqLwogCiAJcHJpbnRrKCJBdGFyaSBoYXJkd2FyZSBmb3VuZDogIik7Ci0JaWYgKE1BQ0hfSVNfTUVEVVNBIHx8IE1BQ0hfSVNfSEFERVMpIHsKKwlpZiAoTUFDSF9JU19NRURVU0EpIHsKIAkJLyogVGhlcmUncyBubyBBdGFyaSB2aWRlbyBoYXJkd2FyZSBvbiB0aGUgTWVkdXNhLCBidXQgYWxsIHRoZQogCQkgKiBhZGRyZXNzZXMgYmVsb3cgZ2VuZXJhdGUgYSBEVEFDSyBzbyBubyBidXMgZXJyb3Igb2NjdXJzISAqLwogCX0gZWxzZSBpZiAoaHdyZWdfcHJlc2VudChmMDMwX3hyZWcpKSB7CkBAIC0yNjksMTAgKzI2OSw2IEBACiAJCUFUQVJJSFdfU0VUKFNDU0lfRE1BKTsKIAkJcHJpbnRrKCJUVF9TQ1NJX0RNQSAiKTsKIAl9Ci0JaWYgKCFNQUNIX0lTX0hBREVTICYmIGh3cmVnX3ByZXNlbnQoJnN0X2RtYS5kbWFfaGkpKSB7Ci0JCUFUQVJJSFdfU0VUKFNUTkRfRE1BKTsKLQkJcHJpbnRrKCJTVE5EX0RNQSAiKTsKLQl9CiAJLyoKIAkgKiBUaGUgU1QtRE1BIGFkZHJlc3MgcmVnaXN0ZXJzIGFyZW4ndCByZWFkYWJsZQogCSAqIG9uIGFsbCBNZWR1c2FzLCBzbyB0aGUgdGVzdCBiZWxvdyBtYXkgZmFpbApAQCAtMjk0LDEyICsyOTAsMTEgQEAKIAkJQVRBUklIV19TRVQoWU1fMjE0OSk7CiAJCXByaW50aygiWU0yMTQ5ICIpOwogCX0KLQlpZiAoIU1BQ0hfSVNfTUVEVVNBICYmICFNQUNIX0lTX0hBREVTICYmCi0JCWh3cmVnX3ByZXNlbnQoJnR0X2RtYXNuZC5jdHJsKSkgeworCWlmICghTUFDSF9JU19NRURVU0EgJiYgaHdyZWdfcHJlc2VudCgmdHRfZG1hc25kLmN0cmwpKSB7CiAJCUFUQVJJSFdfU0VUKFBDTV84QklUKTsKIAkJcHJpbnRrKCJQQ00gIik7CiAJfQotCWlmICghTUFDSF9JU19IQURFUyAmJiBod3JlZ19wcmVzZW50KCZmYWxjb25fY29kZWMudW51c2VkNSkpIHsKKwlpZiAoaHdyZWdfcHJlc2VudCgmZmFsY29uX2NvZGVjLnVudXNlZDUpKSB7CiAJCUFUQVJJSFdfU0VUKENPREVDKTsKIAkJcHJpbnRrKCJDT0RFQyAiKTsKIAl9CkBAIC0zMTMsNyArMzA4LDcgQEAKIAkgICAgKHR0X3NjY19kbWEuZG1hX2N0cmwgPSAweDAxLCAodHRfc2NjX2RtYS5kbWFfY3RybCAmIDEpID09IDEpICYmCiAJICAgICh0dF9zY2NfZG1hLmRtYV9jdHJsID0gMHgwMCwgKHR0X3NjY19kbWEuZG1hX2N0cmwgJiAxKSA9PSAwKQogI2Vsc2UKLQkgICAgIU1BQ0hfSVNfTUVEVVNBICYmICFNQUNIX0lTX0hBREVTCisJICAgICFNQUNIX0lTX01FRFVTQQogI2VuZGlmCiAJICAgICkgewogCQlBVEFSSUhXX1NFVChTQ0NfRE1BKTsKQEAgLTMyNywxMCArMzIyLDcgQEAKIAkJQVRBUklIV19TRVQoU1RfRVNDQyk7CiAJCXByaW50aygiU1RfRVNDQyAiKTsKIAl9Ci0JaWYgKE1BQ0hfSVNfSEFERVMpIHsKLQkJQVRBUklIV19TRVQoVk1FKTsKLQkJcHJpbnRrKCJWTUUgIik7Ci0JfSBlbHNlIGlmIChod3JlZ19wcmVzZW50KCZ0dF9zY3Uuc3lzX21hc2spKSB7CisJaWYgKGh3cmVnX3ByZXNlbnQoJnR0X3NjdS5zeXNfbWFzaykpIHsKIAkJQVRBUklIV19TRVQoU0NVKTsKIAkJLyogQXNzdW1lIGEgVk1FIGJ1cyBpZiB0aGVyZSdzIGEgU0NVICovCiAJCUFUQVJJSFdfU0VUKFZNRSk7CkBAIC0zNDAsNyArMzMyLDcgQEAKIAkJQVRBUklIV19TRVQoQU5BTE9HX0pPWSk7CiAJCXByaW50aygiQU5BTE9HX0pPWSAiKTsKIAl9Ci0JaWYgKCFNQUNIX0lTX0hBREVTICYmIGh3cmVnX3ByZXNlbnQoYmxpdHRlci5oYWxmdG9uZSkpIHsKKwlpZiAoaHdyZWdfcHJlc2VudChibGl0dGVyLmhhbGZ0b25lKSkgewogCQlBVEFSSUhXX1NFVChCTElUVEVSKTsKIAkJcHJpbnRrKCJCTElUVEVSICIpOwogCX0KQEAgLTM0OSw4ICszNDEsNyBAQAogCQlwcmludGsoIklERSAiKTsKIAl9CiAjaWYgMSAvKiBUaGlzIG1heWJlIHdyb25nICovCi0JaWYgKCFNQUNIX0lTX01FRFVTQSAmJiAhTUFDSF9JU19IQURFUyAmJgotCSAgICBod3JlZ19wcmVzZW50KCZ0dF9taWNyb3dpcmUuZGF0YSkgJiYKKwlpZiAoIU1BQ0hfSVNfTUVEVVNBICYmIGh3cmVnX3ByZXNlbnQoJnR0X21pY3Jvd2lyZS5kYXRhKSAmJgogCSAgICBod3JlZ19wcmVzZW50KCZ0dF9taWNyb3dpcmUubWFzaykgJiYKIAkgICAgKHR0X21pY3Jvd2lyZS5tYXNrID0gMHg3ZmYsCiAJICAgICB1ZGVsYXkoMSksCkBAIC0zNjksMTkgKzM2MCwxOCBAQAogCQltYWNoX2h3Y2xrID0gYXRhcmlfdHRfaHdjbGs7CiAJCW1hY2hfc2V0X2Nsb2NrX21tc3MgPSBhdGFyaV90dF9zZXRfY2xvY2tfbW1zczsKIAl9Ci0JaWYgKCFNQUNIX0lTX0hBREVTICYmIGh3cmVnX3ByZXNlbnQoJm1zdGVfcnRjLnNlY19vbmVzKSkgeworCWlmIChod3JlZ19wcmVzZW50KCZtc3RlX3J0Yy5zZWNfb25lcykpIHsKIAkJQVRBUklIV19TRVQoTVNURV9DTEspOwogCQlwcmludGsoIk1TVEVfQ0xLICIpOwogCQltYWNoX2h3Y2xrID0gYXRhcmlfbXN0ZV9od2NsazsKIAkJbWFjaF9zZXRfY2xvY2tfbW1zcyA9IGF0YXJpX21zdGVfc2V0X2Nsb2NrX21tc3M7CiAJfQotCWlmICghTUFDSF9JU19NRURVU0EgJiYgIU1BQ0hfSVNfSEFERVMgJiYKLQkgICAgaHdyZWdfcHJlc2VudCgmZG1hX3dkLmZkY19zcGVlZCkgJiYKKwlpZiAoIU1BQ0hfSVNfTUVEVVNBICYmIGh3cmVnX3ByZXNlbnQoJmRtYV93ZC5mZGNfc3BlZWQpICYmCiAJICAgIGh3cmVnX3dyaXRlKCZkbWFfd2QuZmRjX3NwZWVkLCAwKSkgewogCQlBVEFSSUhXX1NFVChGRENTUEVFRCk7CiAJCXByaW50aygiRkRDX1NQRUVEICIpOwogCX0KLQlpZiAoIU1BQ0hfSVNfSEFERVMgJiYgIUFUQVJJSFdfUFJFU0VOVChTVF9TQ1NJKSkgeworCWlmICghQVRBUklIV19QUkVTRU5UKFNUX1NDU0kpKSB7CiAJCUFUQVJJSFdfU0VUKEFDU0kpOwogCQlwcmludGsoIkFDU0kgIik7CiAJfQpAQCAtNDQ5LDcgKzQzOSw3IEBACiAJICogMHhGRnh4eHh4eCAtPiAweDAweHh4eHh4LCBzbyB0aGF0IHRoZSBmaXJzdCAxNk1CIGlzIGFjY2Vzc2libGUKIAkgKiBpbiB0aGUgbGFzdCAxNk1CIG9mIHRoZSBhZGRyZXNzIHNwYWNlLgogCSAqLwotCXRvc192ZXJzaW9uID0gKE1BQ0hfSVNfTUVEVVNBIHx8IE1BQ0hfSVNfSEFERVMpID8KKwl0b3NfdmVyc2lvbiA9IChNQUNIX0lTX01FRFVTQSkgPwogCQkJMHhmZmYgOiAqKHVuc2lnbmVkIHNob3J0ICopMHhmZjAwMDAwMjsKIAlhdGFyaV9ydGNfeWVhcl9vZmZzZXQgPSAodG9zX3ZlcnNpb24gPCAweDMwNikgPyA3MCA6IDY4OwogfQpAQCAtNTExLDggKzUwMSw3IEBACiAJICogT24gdGhlIE1lZHVzYSwgcGh5cy4gMHg0IG1heSBjb250YWluIGdhcmJhZ2UgYmVjYXVzZSBpdCdzIG5vCiAJICogUk9NLiAgU2VlIGFib3ZlIGZvciBleHBsYW5hdGlvbiB3aHkgd2UgY2Fubm90IHVzZSBQVE9WKDQpLgogCSAqLwotCXJlc2V0X2FkZHIgPSBNQUNIX0lTX0hBREVTID8gMHg3ZmUwMDAzMCA6Ci0JCSAgICAgTUFDSF9JU19NRURVU0EgfHwgTUFDSF9JU19BQjQwID8gMHhlMDAwMzAgOgorCXJlc2V0X2FkZHIgPSBNQUNIX0lTX01FRFVTQSB8fCBNQUNIX0lTX0FCNDAgPyAweGUwMDAzMCA6CiAJCSAgICAgKih1bnNpZ25lZCBsb25nICopIDB4ZmYwMDAwMDQ7CiAKIAkvKiByZXNldCBBQ0lBIGZvciBzd2l0Y2ggb2ZmIE92ZXJTY2FuLCBpZiBpdCdzIGFjdGl2ZSAqLwpAQCAtNjA2LDggKzU5NSw2IEBACiAJCWlmIChNQUNIX0lTX01FRFVTQSkKIAkJCS8qIE1lZHVzYSBoYXMgVFQgX01DSCBjb29raWUgKi8KIAkJCXN0cmNhdChtb2RlbCwgIk1lZHVzYSIpOwotCQllbHNlIGlmIChNQUNIX0lTX0hBREVTKQotCQkJc3RyY2F0KG1vZGVsLCAiSGFkZXMiKTsKIAkJZWxzZQogCQkJc3RyY2F0KG1vZGVsLCAiVFQiKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvaGFkZXMtcGNpLmMgYi9hcmNoL202OGsvYXRhcmkvaGFkZXMtcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYmFiYzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL2hhZGVzLXBjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qCi0gKiBoYWRlcy1wY2kuYyAtIEhhcmR3YXJlIHNwZWNpZmljIFBDSSBCSU9TIGZ1bmN0aW9ucyB0aGUgSGFkZXMgQXRhcmkgY2xvbmUuCi0gKgotICogV3JpdHRlbiBieSBXb3V0IEtsYXJlbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaWYgMAotIyBkZWZpbmUgREJHX0RFVlMoYXJncykJCXByaW50ayBhcmdzCi0jZWxzZQotIyBkZWZpbmUgREJHX0RFVlMoYXJncykKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENPTkZJR19IQURFUykKLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9wY2kuaD4KLQotI2RlZmluZSBIQURFU19NRU1fQkFTRQkJMHg4MDAwMDAwMAotI2RlZmluZSBIQURFU19NRU1fU0laRQkJMHgyMDAwMDAwMAotI2RlZmluZSBIQURFU19DT05GSUdfQkFTRQkweEEwMDAwMDAwCi0jZGVmaW5lIEhBREVTX0NPTkZJR19TSVpFCTB4MTAwMDAwMDAKLSNkZWZpbmUgSEFERVNfSU9fQkFTRQkJMHhCMDAwMDAwMAotI2RlZmluZSBIQURFU19JT19TSVpFCQkweDEwMDAwMDAwCi0jZGVmaW5lIEhBREVTX1ZJUlRfSU9fU0laRQkweDAwMDEwMDAwCS8qIE9ubHkgNjRrIGlzIHJlbWFwcGVkIGFuZCBhY3R1YWxseSB1c2VkLiAqLwotCi0jZGVmaW5lIE5fU0xPVFMJCQkJNAkJCS8qIE51bWJlciBvZiBQQ0kgc2xvdHMuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyIHBjaV9tZW1fbmFtZVtdID0gIlBDSSBtZW1vcnkgc3BhY2UiOwotc3RhdGljIGNvbnN0IGNoYXIgcGNpX2lvX25hbWVbXSA9ICJQQ0kgSS9PIHNwYWNlIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBjaV9jb25maWdfbmFtZVtdID0gIlBDSSBjb25maWcgc3BhY2UiOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbmZpZ19zcGFjZSA9IHsKLSAgICAubmFtZSA9IHBjaV9jb25maWdfbmFtZSwKLSAgICAuc3RhcnQgPSBIQURFU19DT05GSUdfQkFTRSwKLSAgICAuZW5kID0gSEFERVNfQ09ORklHX0JBU0UgKyBIQURFU19DT05GSUdfU0laRSAtIDEKLX07Ci1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlvX3NwYWNlID0gewotICAgIC5uYW1lID0gcGNpX2lvX25hbWUsCi0gICAgLnN0YXJ0ID0gSEFERVNfSU9fQkFTRSwKLSAgICAuZW5kID0gSEFERVNfSU9fQkFTRSArIEhBREVTX0lPX1NJWkUgLSAxCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBwY2lfY29uZl9iYXNlX3BoeXNbXSA9IHsKLSAgICAweEEwMDgwMDAwLCAweEEwMDQwMDAwLCAweEEwMDIwMDAwLCAweEEwMDEwMDAwCi19Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNpX2NvbmZfYmFzZV92aXJ0W05fU0xPVFNdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNpX2lvX2Jhc2VfdmlydDsKLQotLyoKLSAqIHN0YXRpYyB2b2lkICpta19jb25mX2FkZHIodW5zaWduZWQgY2hhciBidXMsIHVuc2lnbmVkIGNoYXIgZGV2aWNlX2ZuLAotICoJCQkgICAgIHVuc2lnbmVkIGNoYXIgd2hlcmUpCi0gKgotICogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBhcmVhIG9mIHRoZSBnaXZlbgotICogZGV2aWNlLgotICoKLSAqIEJVRzogYm9hcmRzIHdpdGggbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBwcm9iYWJseSBub3QgY29ycmVjdGx5Ci0gKiBzdXBwb3J0ZWQuCi0gKi8KLQotc3RhdGljIHZvaWQgKm1rX2NvbmZfYWRkcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUpCi17Ci0JaW50IGRldmljZSA9IGRldi0+ZGV2Zm4gPj4gMywgZnVuY3Rpb24gPSBkZXYtPmRldmZuICYgNzsKLQl2b2lkICpyZXN1bHQ7Ci0KLQlEQkdfREVWUygoIm1rX2NvbmZfYWRkcihidXM9JWQgLGRldmljZV9mbj0weCV4LCB3aGVyZT0weCV4LCBwY2lfYWRkcj0weCVwKVxuIiwKLQkJICBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuLCB3aGVyZSwgcGNpX2FkZHIpKTsKLQotCWlmIChkZXZpY2UgPiAzKQotCXsKLQkJREJHX0RFVlMoKCJta19jb25mX2FkZHI6IGRldmljZSAoJWQpID4gMywgcmV0dXJuaW5nIE5VTExcbiIsIGRldmljZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoZGV2LT5idXMtPm51bWJlciAhPSAwKQotCXsKLQkJREJHX0RFVlMoKCJta19jb25mX2FkZHI6IGJ1cyAoJWQpID4gMCwgcmV0dXJuaW5nIE5VTExcbiIsIGRldmljZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXN1bHQgPSAodm9pZCAqKSAocGNpX2NvbmZfYmFzZV92aXJ0W2RldmljZV0gfCAoZnVuY3Rpb24gPDwgOCkgfCAod2hlcmUpKTsKLQlEQkdfREVWUygoIm1rX2NvbmZfYWRkcjogcmV0dXJuaW5nIHBjaV9hZGRyIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZykgcmVzdWx0KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBoYWRlc19yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwgdTggKnZhbHVlKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBjaV9hZGRyOwotCi0JKnZhbHVlID0gMHhmZjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBta19jb25mX2FkZHIoZGV2LCB3aGVyZSkpID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkqdmFsdWUgPSAqcGNpX2FkZHI7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IGhhZGVzX3JlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1MTYgKnZhbHVlKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwY2lfYWRkcjsKLQotCSp2YWx1ZSA9IDB4ZmZmZjsKLQotCWlmICh3aGVyZSAmIDB4MSkKLQkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgc2hvcnQgKikgbWtfY29uZl9hZGRyKGRldiwgd2hlcmUpKSA9PSBOVUxMKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JKnZhbHVlID0gbGUxNl90b19jcHUoKnBjaV9hZGRyKTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgaGFkZXNfcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1MzIgKnZhbHVlKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqcGNpX2FkZHI7Ci0JdW5zaWduZWQgY2hhciBoZWFkZXJfdHlwZTsKLQlpbnQgcmVzdWx0OwotCi0JKnZhbHVlID0gMHhmZmZmZmZmZjsKLQotCWlmICh3aGVyZSAmIDB4MykKLQkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgaW50ICopIG1rX2NvbmZfYWRkcihkZXYsIHdoZXJlKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCSp2YWx1ZSA9IGxlMzJfdG9fY3B1KCpwY2lfYWRkcik7Ci0KLQkvKgotCSAqIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhbiBhZGRyZXNzIG9uIHRoZSBidXMuIElmIHRydWUsIGFkZCB0aGUKLQkgKiBiYXNlIGFkZHJlc3Mgb2YgdGhlIFBDSSBtZW1vcnkgb3IgUENJIEkvTyBhcmVhIG9uIHRoZSBIYWRlcy4KLQkgKi8KLQotCWlmICgocmVzdWx0ID0gaGFkZXNfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9IRUFERVJfVFlQRSwKLQkJCQkJICAgICAmaGVhZGVyX3R5cGUpKSAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoKCh3aGVyZSA+PSBQQ0lfQkFTRV9BRERSRVNTXzApICYmICh3aGVyZSA8PSBQQ0lfQkFTRV9BRERSRVNTXzEpKSB8fAotCSAgICAoKGhlYWRlcl90eXBlICE9IFBDSV9IRUFERVJfVFlQRV9CUklER0UpICYmICgod2hlcmUgPj0gUENJX0JBU0VfQUREUkVTU18yKSAmJgotCQkJCQkJCSAod2hlcmUgPD0gUENJX0JBU0VfQUREUkVTU181KSkpKQotCXsKLQkJaWYgKCgqdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKQotCQl7Ci0JCQkvKgotCQkJICogQmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgYW4gSS9PIGFkZHJlc3MuIElmIHRoZQotCQkJICogYWRkcmVzcyBpcyB2YWxpZCBvbiB0aGUgSGFkZXMgKDAgPD0gKnZhbHVlIDwgSEFERVNfVklSVF9JT19TSVpFKSwKLQkJCSAqIGFkZCAncGNpX2lvX2Jhc2VfdmlydCcgdG8gdGhlIHZhbHVlLgotCQkJICovCi0KLQkJCWlmICgqdmFsdWUgPCBIQURFU19WSVJUX0lPX1NJWkUpCi0JCQkJKnZhbHVlICs9IHBjaV9pb19iYXNlX3ZpcnQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJICogQmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgYW4gbWVtb3J5IGFkZHJlc3MuIElmIHRoZQotCQkJICogYWRkcmVzcyBpcyB2YWxpZCBvbiB0aGUgSGFkZXMgKDAgPD0gKnZhbHVlIDwgSEFERVNfTUVNX1NJWkUpLAotCQkJICogYWRkIEhBREVTX01FTV9CQVNFIHRvIHRoZSB2YWx1ZS4KLQkJCSAqLwotCi0JCQlpZiAoKnZhbHVlID09IDApCi0JCQl7Ci0JCQkJLyoKLQkJCQkgKiBCYXNlIGFkZHJlc3MgaXMgMC4gVGVzdCBpZiB0aGlzIGJhc2UKLQkJCQkgKiBhZGRyZXNzIHJlZ2lzdGVyIGlzIHVzZWQuCi0JCQkJICovCi0KLQkJCQkqcGNpX2FkZHIgPSAweGZmZmZmZmZmOwotCQkJCWlmICgqcGNpX2FkZHIgIT0gMCkKLQkJCQl7Ci0JCQkJCSpwY2lfYWRkciA9ICp2YWx1ZTsKLQkJCQkJaWYgKCp2YWx1ZSA8IEhBREVTX01FTV9TSVpFKQotCQkJCQkJKnZhbHVlICs9IEhBREVTX01FTV9CQVNFOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKnZhbHVlIDwgSEFERVNfTUVNX1NJWkUpCi0JCQkJCSp2YWx1ZSArPSBIQURFU19NRU1fQkFTRTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgaGFkZXNfd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1OCB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2lfYWRkcjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBta19jb25mX2FkZHIoZGV2LCB3aGVyZSkpID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkqcGNpX2FkZHIgPSB2YWx1ZTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgaGFkZXNfd3JpdGVfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1MTYgdmFsdWUpCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnBjaV9hZGRyOwotCi0JaWYgKChwY2lfYWRkciA9ICh1bnNpZ25lZCBzaG9ydCAqKSBta19jb25mX2FkZHIoZGV2LCB3aGVyZSkpID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkqcGNpX2FkZHIgPSBjcHVfdG9fbGUxNih2YWx1ZSk7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IGhhZGVzX3dyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsIHUzMiB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnBjaV9hZGRyOwotCXVuc2lnbmVkIGNoYXIgaGVhZGVyX3R5cGU7Ci0JaW50IHJlc3VsdDsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgaW50ICopIG1rX2NvbmZfYWRkcihkZXYsIHdoZXJlKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIGFkZHJlc3Mgb24gdGhlIGJ1cy4gSWYgdHJ1ZSwgc3VidHJhY3QgdGhlCi0JICogYmFzZSBhZGRyZXNzIG9mIHRoZSBQQ0kgbWVtb3J5IG9yIFBDSSBJL08gYXJlYSBvbiB0aGUgSGFkZXMuCi0JICovCi0KLQlpZiAoKHJlc3VsdCA9IGhhZGVzX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsCi0JCQkJCSAgICAgJmhlYWRlcl90eXBlKSkgIT0gUENJQklPU19TVUNDRVNTRlVMKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JaWYgKCgod2hlcmUgPj0gUENJX0JBU0VfQUREUkVTU18wKSAmJiAod2hlcmUgPD0gUENJX0JBU0VfQUREUkVTU18xKSkgfHwKLQkgICAgKChoZWFkZXJfdHlwZSAhPSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSAmJiAoKHdoZXJlID49IFBDSV9CQVNFX0FERFJFU1NfMikgJiYKLQkJCQkJCQkgKHdoZXJlIDw9IFBDSV9CQVNFX0FERFJFU1NfNSkpKSkKLQl7Ci0JCWlmICgodmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PQotCQkgICAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykKLQkJewotCQkJLyoKLQkJCSAqIEkvTyBhZGRyZXNzLiBDaGVjayBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCBhZGRyZXNzIG9uCi0JCQkgKiB0aGUgSGFkZXMgKHBjaV9pb19iYXNlX3ZpcnQgPD0gdmFsdWUgPCBwY2lfaW9fYmFzZV92aXJ0ICsKLQkJCSAqIEhBREVTX1ZJUlRfSU9fU0laRSkgb3IgaWYgdGhlIHZhbHVlIGlzIDB4ZmZmZmZmZmYuIElmIG5vdAotCQkJICogdHJ1ZSBkbyBub3Qgd3JpdGUgdGhlIGJhc2UgYWRkcmVzcyByZWdpc3Rlci4gSWYgaXQgaXMgYQotCQkJICogdmFsaWQgYmFzZSBhZGRyZXNzIHN1YnRyYWN0ICdwY2lfaW9fYmFzZV92aXJ0JyBmcm9tIHRoZSB2YWx1ZS4KLQkJCSAqLwotCi0JCQlpZiAoKHZhbHVlID49IHBjaV9pb19iYXNlX3ZpcnQpICYmICh2YWx1ZSA8IChwY2lfaW9fYmFzZV92aXJ0ICsKLQkJCQkJCQkJCQkJCQkJIEhBREVTX1ZJUlRfSU9fU0laRSkpKQotCQkJCXZhbHVlIC09IHBjaV9pb19iYXNlX3ZpcnQ7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHZhbHVlICE9IDB4ZmZmZmZmZmYpCi0JCQkJCXJldHVybiBQQ0lCSU9TX1NFVF9GQUlMRUQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJICogTWVtb3J5IGFkZHJlc3MuIENoZWNrIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkIGFkZHJlc3Mgb24KLQkJCSAqIHRoZSBIYWRlcyAoSEFERVNfTUVNX0JBU0UgPD0gdmFsdWUgPCBIQURFU19NRU1fQkFTRSArIEhBREVTX01FTV9TSVpFKSBvcgotCQkJICogaWYgdGhlIHZhbHVlIGlzIDB4ZmZmZmZmZmYuIElmIG5vdCB0cnVlIGRvIG5vdCB3cml0ZQotCQkJICogdGhlIGJhc2UgYWRkcmVzcyByZWdpc3Rlci4gSWYgaXQgaXMgYSB2YWxpZCBiYXNlIGFkZHJlc3MKLQkJCSAqIHN1YnRyYWN0IEhBREVTX01FTV9CQVNFIGZyb20gdGhlIHZhbHVlLgotCQkJICovCi0KLQkJCWlmICgodmFsdWUgPj0gSEFERVNfTUVNX0JBU0UpICYmICh2YWx1ZSA8IChIQURFU19NRU1fQkFTRSArIEhBREVTX01FTV9TSVpFKSkpCi0JCQkJdmFsdWUgLT0gSEFERVNfTUVNX0JBU0U7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHZhbHVlICE9IDB4ZmZmZmZmZmYpCi0JCQkJCXJldHVybiBQQ0lCSU9TX1NFVF9GQUlMRUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkqcGNpX2FkZHIgPSBjcHVfdG9fbGUzMih2YWx1ZSk7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi0vKgotICogc3RhdGljIGlubGluZSB2b2lkIGhhZGVzX2ZpeHVwKHZvaWQpCi0gKgotICogQXNzaWduIElSUSBudW1iZXJzIGFzIHVzZWQgYnkgTGludXggdG8gdGhlIGludGVycnVwdCBwaW5zCi0gKiBvZiB0aGUgUENJIGNhcmRzLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBoYWRlc19maXh1cChpbnQgcGNpX21vZGlmeSkKLXsKLQljaGFyIGlycV90YWJbNF0gPSB7Ci0JCVswXSA9IElSUV9UVF9NRlBfSU8wLAkJLyogU2xvdCAwLiAqLwotCQlbMV0gPSBJUlFfVFRfTUZQX0lPMSwJCS8qIFNsb3QgMS4gKi8KLQkJWzJdID0gSVJRX1RUX01GUF9TQ0MsCQkvKiBTbG90IDIuICovCi0JCVszXSA9IElSUV9UVF9NRlBfU0NTSURNQQkvKiBTbG90IDMuICovCi0JfTsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIHNsb3Q7Ci0KLQkvKgotCSAqIEdvIHRocm91Z2ggYWxsIGRldmljZXMsIGZpeGluZyB1cCBpcnFzIGFzIHdlIHNlZSBmaXQ6Ci0JICovCi0KLQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpCi0JewotCQlpZiAoZGV2LT5jbGFzcyA+PiAxNiAhPSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCi0JCXsKLQkJCXNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKTsJLyogRGV0ZXJtaW5lIHNsb3QgbnVtYmVyLiAqLwotCQkJZGV2LT5pcnEgPSBpcnFfdGFiW3Nsb3RdOwotCQkJaWYgKHBjaV9tb2RpZnkpCi0JCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBzdGF0aWMgdm9pZCBoYWRlc19jb25mX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotICoKLSAqIE1hY2hpbmUgZGVwZW5kZW50IENvbmZpZ3VyZSB0aGUgZ2l2ZW4gZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICogZGV2CQktIHRoZSBwY2kgZGV2aWNlLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBoYWRlc19jb25mX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDApOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgaGFkZXNfcGNpX29wcyA9IHsKLQkucmVhZF9ieXRlID0JaGFkZXNfcmVhZF9jb25maWdfYnl0ZSwKLQkucmVhZF93b3JkID0JaGFkZXNfcmVhZF9jb25maWdfd29yZCwKLQkucmVhZF9kd29yZCA9CWhhZGVzX3JlYWRfY29uZmlnX2R3b3JkLAotCS53cml0ZV9ieXRlID0JaGFkZXNfd3JpdGVfY29uZmlnX2J5dGUsCi0JLndyaXRlX3dvcmQgPQloYWRlc193cml0ZV9jb25maWdfd29yZCwKLQkud3JpdGVfZHdvcmQgPQloYWRlc193cml0ZV9jb25maWdfZHdvcmQKLX07Ci0KLS8qCi0gKiBzdHJ1Y3QgcGNpX2J1c19pbmZvICppbml0X2hhZGVzX3BjaSh2b2lkKQotICoKLSAqIE1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb246Ci0gKgotICogLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhICdwY2lfYnVzX2luZm8nIHN0cnVjdHVyZQotICogLSBJbml0aWFsaXNlIGhhcmR3YXJlCi0gKgotICogUmVzdWx0OiBwb2ludGVyIHRvICdwY2lfYnVzX2luZm8nIHN0cnVjdHVyZS4KLSAqLwotCi1zdHJ1Y3QgcGNpX2J1c19pbmZvICogX19pbml0IGluaXRfaGFkZXNfcGNpKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9idXNfaW5mbyAqYnVzOwotCWludCBpOwotCi0JLyoKLQkgKiBSZW1hcCBJL08gYW5kIGNvbmZpZ3VyYXRpb24gc3BhY2UuCi0JICovCi0KLQlwY2lfaW9fYmFzZV92aXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoSEFERVNfSU9fQkFTRSwgSEFERVNfVklSVF9JT19TSVpFKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOX1NMT1RTOyBpKyspCi0JCXBjaV9jb25mX2Jhc2VfdmlydFtpXSA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKHBjaV9jb25mX2Jhc2VfcGh5c1tpXSwgMHgxMDAwMCk7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYnVzIGluZm8gc3RydWN0dXJlLgotCSAqLwotCi0JYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9idXNfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghYnVzKSkKLQkJZ290byBpb3VubWFwX2Jhc2VfdmlydDsKLQotCS8qCi0JICogQ2xhaW0gcmVzb3VyY2VzLiBUaGUgbTY4ayBoYXMgbm8gc2VwYXJhdGUgSS9PIHNwYWNlLCBib3RoCi0JICogUENJIG1lbW9yeSBzcGFjZSBhbmQgUENJIEkvTyBzcGFjZSBhcmUgaW4gbWVtb3J5IHNwYWNlLiBUaGVyZWZvcmUKLQkgKiB0aGUgSS9PIHJlc291cmNlcyBhcmUgcmVxdWVzdGVkIGluIG1lbW9yeSBzcGFjZSBhcyB3ZWxsLgotCSAqLwotCi0JaWYgKHVubGlrZWx5KHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmY29uZmlnX3NwYWNlKSAhPSAwKSkKLQkJZ290byBmcmVlX2J1czsKLQotCWlmICh1bmxpa2VseShyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmlvX3NwYWNlKSAhPSAwKSkKLQkJZ290byByZWxlYXNlX2NvbmZpZ19zcGFjZTsKLQotCWJ1cy0+bWVtX3NwYWNlLnN0YXJ0ID0gSEFERVNfTUVNX0JBU0U7Ci0JYnVzLT5tZW1fc3BhY2UuZW5kID0gSEFERVNfTUVNX0JBU0UgKyBIQURFU19NRU1fU0laRSAtIDE7Ci0JYnVzLT5tZW1fc3BhY2UubmFtZSA9IHBjaV9tZW1fbmFtZTsKLSNpZiAxCi0JaWYgKHVubGlrZWx5KHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmYnVzLT5tZW1fc3BhY2UpICE9IDApKQotCQlnb3RvIHJlbGVhc2VfaW9fc3BhY2U7Ci0jZW5kaWYKLQlidXMtPmlvX3NwYWNlLnN0YXJ0ID0gcGNpX2lvX2Jhc2VfdmlydDsKLQlidXMtPmlvX3NwYWNlLmVuZCA9IHBjaV9pb19iYXNlX3ZpcnQgKyBIQURFU19WSVJUX0lPX1NJWkUgLSAxOwotCWJ1cy0+aW9fc3BhY2UubmFtZSA9IHBjaV9pb19uYW1lOwotI2lmIDEKLQlpZiAodW5saWtlbHkocmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmYnVzLT5pb19zcGFjZSkgIT0gMCkpCi0JCWdvdG8gcmVsZWFzZV9idXNfbWVtX3NwYWNlOwotI2VuZGlmCi0JLyoKLQkgKiBTZXQgaGFyZHdhcmUgZGVwZW5kZW50IGZ1bmN0aW9ucy4KLQkgKi8KLQotCWJ1cy0+bTY4a19wY2lfb3BzID0gJmhhZGVzX3BjaV9vcHM7Ci0JYnVzLT5maXh1cCA9IGhhZGVzX2ZpeHVwOwotCWJ1cy0+Y29uZl9kZXZpY2UgPSBoYWRlc19jb25mX2RldmljZTsKLQotCS8qCi0JICogU2VsZWN0IGhpZ2ggdG8gbG93IGVkZ2UgZm9yIFBDSSBpbnRlcnJ1cHRzLgotCSAqLwotCi0JdHRfbWZwLmFjdGl2ZV9lZGdlICY9IH4weDI3OwotCi0JcmV0dXJuIGJ1czsKLQotcmVsZWFzZV9idXNfbWVtX3NwYWNlOgotCXJlbGVhc2VfcmVzb3VyY2UoJmJ1cy0+bWVtX3NwYWNlKTsKLXJlbGVhc2VfaW9fc3BhY2U6Ci0JcmVsZWFzZV9yZXNvdXJjZSgmaW9fc3BhY2UpOwotcmVsZWFzZV9jb25maWdfc3BhY2U6Ci0JcmVsZWFzZV9yZXNvdXJjZSgmY29uZmlnX3NwYWNlKTsKLWZyZWVfYnVzOgotCWtmcmVlKGJ1cyk7Ci1pb3VubWFwX2Jhc2VfdmlydDoKLQlpb3VubWFwKCh2b2lkICopcGNpX2lvX2Jhc2VfdmlydCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTl9TTE9UUzsgaSsrKQotCQlpb3VubWFwKCh2b2lkICopcGNpX2NvbmZfYmFzZV92aXJ0W2ldKTsKLQotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvdGltZS5jIGIvYXJjaC9tNjhrL2F0YXJpL3RpbWUuYwppbmRleCBlMGQzYzhiLi4xZWRkZTI3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvdGltZS5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS90aW1lLmMKQEAgLTIwLDYgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KIAorREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19sb2NrKTsKKwogdm9pZCBfX2luaXQKIGF0YXJpX3NjaGVkX2luaXQoaXJxX2hhbmRsZXJfdCB0aW1lcl9yb3V0aW5lKQogewpAQCAtMTkxLDEzICsxOTQsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSkgewotICAgICAgICAgICAgQklOX1RPX0JDRChzZWMpOwotICAgICAgICAgICAgQklOX1RPX0JDRChtaW4pOwotICAgICAgICAgICAgQklOX1RPX0JDRChob3VyKTsKLSAgICAgICAgICAgIEJJTl9UT19CQ0QoZGF5KTsKLSAgICAgICAgICAgIEJJTl9UT19CQ0QobW9uKTsKLSAgICAgICAgICAgIEJJTl9UT19CQ0QoeWVhcik7Ci0gICAgICAgICAgICBpZiAod2RheSA+PSAwKSBCSU5fVE9fQkNEKHdkYXkpOworCSAgICBzZWMgPSBiaW4yYmNkKHNlYyk7CisJICAgIG1pbiA9IGJpbjJiY2QobWluKTsKKwkgICAgaG91ciA9IGJpbjJiY2QoaG91cik7CisJICAgIGRheSA9IGJpbjJiY2QoZGF5KTsKKwkgICAgbW9uID0gYmluMmJjZChtb24pOworCSAgICB5ZWFyID0gYmluMmJjZCh5ZWFyKTsKKwkgICAgaWYgKHdkYXkgPj0gMCkKKwkJd2RheSA9IGJpbjJiY2Qod2RheSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MiwxMyArMjU2LDEzIEBACiAJfQogCiAJaWYgKCEoY3RybCAmIFJUQ19ETV9CSU5BUlkpKSB7Ci0gICAgICAgICAgICBCQ0RfVE9fQklOKHNlYyk7Ci0gICAgICAgICAgICBCQ0RfVE9fQklOKG1pbik7Ci0gICAgICAgICAgICBCQ0RfVE9fQklOKGhvdXIpOwotICAgICAgICAgICAgQkNEX1RPX0JJTihkYXkpOwotICAgICAgICAgICAgQkNEX1RPX0JJTihtb24pOwotICAgICAgICAgICAgQkNEX1RPX0JJTih5ZWFyKTsKLSAgICAgICAgICAgIEJDRF9UT19CSU4od2RheSk7CisJICAgIHNlYyA9IGJjZDJiaW4oc2VjKTsKKwkgICAgbWluID0gYmNkMmJpbihtaW4pOworCSAgICBob3VyID0gYmNkMmJpbihob3VyKTsKKwkgICAgZGF5ID0gYmNkMmJpbihkYXkpOworCSAgICBtb24gPSBiY2QyYmluKG1vbik7CisJICAgIHllYXIgPSBiY2QyYmluKHllYXIpOworCSAgICB3ZGF5ID0gYmNkMmJpbih3ZGF5KTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghKGN0cmwgJiBSVENfMjRIKSkgewpAQCAtMzE4LDcgKzMyMiw3IEBACiAKICAgICBydGNfbWludXRlcyA9IFJUQ19SRUFEIChSVENfTUlOVVRFUyk7CiAgICAgaWYgKCEoc2F2ZV9jb250cm9sICYgUlRDX0RNX0JJTkFSWSkpCi0gICAgICAgIEJDRF9UT19CSU4gKHJ0Y19taW51dGVzKTsKKwlydGNfbWludXRlcyA9IGJjZDJiaW4ocnRjX21pbnV0ZXMpOwogCiAgICAgLyogU2luY2Ugd2UncmUgb25seSBhZGp1c3RpbmcgbWludXRlcyBhbmQgc2Vjb25kcywgZG9uJ3QgaW50ZXJmZXJlCiAgICAgICAgd2l0aCBob3VyIG92ZXJmbG93LiAgVGhpcyBhdm9pZHMgbWVzc2luZyB3aXRoIHVua25vd24gdGltZSB6b25lcwpAQCAtMzI5LDggKzMzMyw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghKHNhdmVfY29udHJvbCAmIFJUQ19ETV9CSU5BUlkpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQklOX1RPX0JDRCAocmVhbF9zZWNvbmRzKTsKLSAgICAgICAgICAgICAgICAgICAgQklOX1RPX0JDRCAocmVhbF9taW51dGVzKTsKKwkJICAgIHJlYWxfc2Vjb25kcyA9IGJpbjJiY2QocmVhbF9zZWNvbmRzKTsKKwkJICAgIHJlYWxfbWludXRlcyA9IGJpbjJiY2QocmVhbF9taW51dGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBSVENfV1JJVEUgKFJUQ19TRUNPTkRTLCByZWFsX3NlY29uZHMpOwogICAgICAgICAgICAgUlRDX1dSSVRFIChSVENfTUlOVVRFUywgcmVhbF9taW51dGVzKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYwppbmRleCA5NDMzYTg4Li42NWM5MjA0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTQ2LDkgKzQ3LDYgQEAKIGV4dGVybiB2b2lkIGJ2bWU2MDAwX3dhaXRidXQodm9pZCk7CiB2b2lkIGJ2bWU2MDAwX3NldF92ZWN0b3JzICh2b2lkKTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmNkMmJpbiAodW5zaWduZWQgY2hhciBiKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJpbjJiY2QgKHVuc2lnbmVkIGNoYXIgYik7Ci0KIC8qIFNhdmUgdGljayBoYW5kbGVyIHJvdXRpbmUgcG9pbnRlciwgd2lsbCBwb2ludCB0byBkb190aW1lcigpIGluCiAgKiBrZXJuZWwvc2NoZWQuYywgY2FsbGVkIHZpYSBidm1lNjAwMF9wcm9jZXNzX2ludCgpICovCiAKQEAgLTI2NCwxNyArMjYyLDYgQEAKICAgICByZXR1cm4gdjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmNkMmJpbiAodW5zaWduZWQgY2hhciBiKQotewotCXJldHVybiAoKGI+PjQpKjEwICsgKGImMTUpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmluMmJjZCAodW5zaWduZWQgY2hhciBiKQotewotCXJldHVybiAoKChiLzEwKSoxNikgKyAoYiUxMCkpOwotfQotCi0KIC8qCiAgKiBMb29rcyBsaWtlIG9wIGlzIG5vbi16ZXJvIGZvciBzZXR0aW5nIHRoZSBjbG9jaywgYW5kIHplcm8gZm9yCiAgKiByZWFkaW5nIHRoZSBjbG9jay4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYwppbmRleCBlOGFjM2Y3Li44MDhjOTAxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvcnRjLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jCkBAIC01NywxNiArNTcsMTYgQEAKIAkJcnRjLT5tc3IgPSAweDQwOwogCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CiAJCWRvIHsKLQkJCXd0aW1lLnRtX3NlYyA9ICBCQ0QyQklOKHJ0Yy0+YmNkX3NlYyk7Ci0JCQl3dGltZS50bV9taW4gPSAgQkNEMkJJTihydGMtPmJjZF9taW4pOwotCQkJd3RpbWUudG1faG91ciA9IEJDRDJCSU4ocnRjLT5iY2RfaHIpOwotCQkJd3RpbWUudG1fbWRheSA9ICBCQ0QyQklOKHJ0Yy0+YmNkX2RvbSk7Ci0JCQl3dGltZS50bV9tb24gPSAgQkNEMkJJTihydGMtPmJjZF9tdGgpLTE7Ci0JCQl3dGltZS50bV95ZWFyID0gQkNEMkJJTihydGMtPmJjZF95ZWFyKTsKKwkJCXd0aW1lLnRtX3NlYyA9ICBiY2QyYmluKHJ0Yy0+YmNkX3NlYyk7CisJCQl3dGltZS50bV9taW4gPSAgYmNkMmJpbihydGMtPmJjZF9taW4pOworCQkJd3RpbWUudG1faG91ciA9IGJjZDJiaW4ocnRjLT5iY2RfaHIpOworCQkJd3RpbWUudG1fbWRheSA9ICBiY2QyYmluKHJ0Yy0+YmNkX2RvbSk7CisJCQl3dGltZS50bV9tb24gPSAgYmNkMmJpbihydGMtPmJjZF9tdGgpLTE7CisJCQl3dGltZS50bV95ZWFyID0gYmNkMmJpbihydGMtPmJjZF95ZWFyKTsKIAkJCWlmICh3dGltZS50bV95ZWFyIDwgNzApCiAJCQkJd3RpbWUudG1feWVhciArPSAxMDA7Ci0JCQl3dGltZS50bV93ZGF5ID0gQkNEMkJJTihydGMtPmJjZF9kb3cpLTE7Ci0JCX0gd2hpbGUgKHd0aW1lLnRtX3NlYyAhPSBCQ0QyQklOKHJ0Yy0+YmNkX3NlYykpOworCQkJd3RpbWUudG1fd2RheSA9IGJjZDJiaW4ocnRjLT5iY2RfZG93KS0xOworCQl9IHdoaWxlICh3dGltZS50bV9zZWMgIT0gYmNkMmJpbihydGMtPmJjZF9zZWMpKTsKIAkJcnRjLT5tc3IgPSBtc3I7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmd3RpbWUsIHNpemVvZiB3dGltZSkgPwpAQCAtMTE0LDE0ICsxMTQsMTQgQEAKIAogCQlydGMtPnQwY3JfcnRtciA9IHlycyU0OwogCQlydGMtPmJjZF90ZW5tcyA9IDA7Ci0JCXJ0Yy0+YmNkX3NlYyAgID0gQklOMkJDRChzZWMpOwotCQlydGMtPmJjZF9taW4gICA9IEJJTjJCQ0QobWluKTsKLQkJcnRjLT5iY2RfaHIgICAgPSBCSU4yQkNEKGhycyk7Ci0JCXJ0Yy0+YmNkX2RvbSAgID0gQklOMkJDRChkYXkpOwotCQlydGMtPmJjZF9tdGggICA9IEJJTjJCQ0QobW9uKTsKLQkJcnRjLT5iY2RfeWVhciAgPSBCSU4yQkNEKHlycyUxMDApOworCQlydGMtPmJjZF9zZWMgICA9IGJpbjJiY2Qoc2VjKTsKKwkJcnRjLT5iY2RfbWluICAgPSBiaW4yYmNkKG1pbik7CisJCXJ0Yy0+YmNkX2hyICAgID0gYmluMmJjZChocnMpOworCQlydGMtPmJjZF9kb20gICA9IGJpbjJiY2QoZGF5KTsKKwkJcnRjLT5iY2RfbXRoICAgPSBiaW4yYmNkKG1vbik7CisJCXJ0Yy0+YmNkX3llYXIgID0gYmluMmJjZCh5cnMlMTAwKTsKIAkJaWYgKHJ0Y190bS50bV93ZGF5ID49IDApCi0JCQlydGMtPmJjZF9kb3cgPSBCSU4yQkNEKHJ0Y190bS50bV93ZGF5KzEpOworCQkJcnRjLT5iY2RfZG93ID0gYmluMmJjZChydGNfdG0udG1fd2RheSsxKTsKIAkJcnRjLT50MGNyX3J0bXIgPSB5cnMlNCB8IDB4MDg7CiAKIAkJcnRjLT5tc3IgPSBtc3I7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlIGIvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQppbmRleCAzYTdmNjIyLi41NWQ1ZDZiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKQEAgLTE0LDUgKzE0LDQgQEAKIAogZGV2cmVzLXkgPSAuLi8uLi8uLi9rZXJuZWwvaXJxL2RldnJlcy5vCiAKLW9iai0kKENPTkZJR19QQ0kpCSs9IGJpb3MzMi5vCiBvYmoteSQoQ09ORklHX01NVV9TVU4zKSArPSBkbWEubwkjIG5vLCBpdCdzIG5vdCBhIHR5cG8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvYmlvczMyLmMgYi9hcmNoL202OGsva2VybmVsL2Jpb3MzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE3MGMyYi4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsva2VybmVsL2Jpb3MzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qCi0gKiBiaW9zMzIuYyAtIFBDSSBCSU9TIGZ1bmN0aW9ucyBmb3IgbTY4ayBzeXN0ZW1zLgotICoKLSAqIFdyaXR0ZW4gYnkgV291dCBLbGFyZW4uCi0gKgotICogQmFzZWQgb24gdGhlIERFQyBBbHBoYSBiaW9zMzIuYyBieSBEYXZlIFJ1c2xpbmcgYW5kIERhdmlkIE1vc2Jlcmdlci4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaWYgMAotIyBkZWZpbmUgREJHX0RFVlMoYXJncykJCXByaW50ayBhcmdzCi0jZWxzZQotIyBkZWZpbmUgREJHX0RFVlMoYXJncykKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BDSQotCi0vKgotICogUENJIHN1cHBvcnQgZm9yIExpbnV4L202OGsuIEN1cnJlbnRseSBvbmx5IHRoZSBIYWRlcyBpcyBzdXBwb3J0ZWQuCi0gKgotICogVGhlIHN1cHBvcnQgZm9yIFBDSSBicmlkZ2VzIGluIHRoZSBERUMgQWxwaGEgdmVyc2lvbiBoYXMKLSAqIGJlZW4gcmVtb3ZlZCBpbiB0aGlzIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNkZWZpbmUgS0IJCTEwMjQKLSNkZWZpbmUgTUIJCSgxMDI0KktCKQotI2RlZmluZSBHQgkJKDEwMjQqTUIpCi0KLSNkZWZpbmUgTUFKT1JfUkVWCTAKLSNkZWZpbmUgTUlOT1JfUkVWCTUKLQotLyoKLSAqIEFsaWduIFZBTCB0byBBTElHTiwgd2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KLSAqLwotCi0jZGVmaW5lIEFMSUdOKHZhbCxhbGlnbikJKCgodmFsKSArICgoYWxpZ24pIC0gMSkpICYgfigoYWxpZ24pIC0gMSkpCi0KLS8qCi0gKiBPZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBJL08gYW5kIG1lbW9yeSBiYXNlIGFkZHJlc3NlcyBmcm9tIHdoZXJlIHJlc291cmNlcwotICogYXJlIGFsbG9jYXRlZC4KLSAqLwotCi0jZGVmaW5lIElPX0FMTE9DX09GRlNFVAkJMHgwMDAwNDAwMAotI2RlZmluZSBNRU1fQUxMT0NfT0ZGU0VUCTB4MDQwMDAwMDAKLQotLyoKLSAqIERlY2xhcmF0aW9ucyBvZiBoYXJkd2FyZSBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMuCi0gKi8KLQotZXh0ZXJuIHN0cnVjdCBwY2lfYnVzX2luZm8gKmluaXRfaGFkZXNfcGNpKHZvaWQpOwotCi0vKgotICogQnVzIGluZm8gc3RydWN0dXJlIG9mIHRoZSBQQ0kgYnVzLiBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgaXMKLSAqIHB1dCBpbiB0aGUgc3lzZGF0YSBtZW1iZXIgb2YgdGhlIHBjaV9idXMgc3RydWN0dXJlLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2J1c19pbmZvICpidXNfaW5mbzsKLQotc3RhdGljIGludCBwY2lfbW9kaWZ5ID0gMTsJCS8qIElmIHNldCwgbGF5b3V0IHRoZSBQQ0kgYnVzIG91cnNlbGYuICovCi1zdGF0aWMgaW50IHNraXBfdmdhOwkJCS8qIElmIHNldCBkbyBub3QgbW9kaWZ5IGJhc2UgYWRkcmVzc2VzCi0JCQkJCSAgIG9mIHZnYSBjYXJkcy4qLwotc3RhdGljIGludCBkaXNhYmxlX3BjaV9idXJzdDsJCS8qIElmIHNldCBkbyBub3QgYWxsb3cgUENJIGJ1cnN0cy4gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBpb19iYXNlOwotc3RhdGljIHVuc2lnbmVkIGludCBtZW1fYmFzZTsKLQotLyoKLSAqIHN0YXRpYyB2b2lkIGRpc2FibGVfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi0gKgotICogRGlzYWJsZSBQQ0kgZGV2aWNlIERFViBzbyB0aGF0IGl0IGRvZXMgbm90IHJlc3BvbmQgdG8gSS9PIG9yIG1lbW9yeQotICogYWNjZXNzZXMuCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKiBkZXYJLSBkZXZpY2UgdG8gZGlzYWJsZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZGlzYWJsZV9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1bnNpZ25lZCBzaG9ydCBjbWQ7Ci0KLQlpZiAoKChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSkgfHwKLQkgICAgIChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBKSB8fAotCSAgICAgKGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfRElTUExBWV9YR0EpKSAmJiBza2lwX3ZnYSkKLQkJcmV0dXJuOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0KLQljbWQgJj0gKH5QQ0lfQ09NTUFORF9JTyAmIH5QQ0lfQ09NTUFORF9NRU1PUlkgJiB+UENJX0NPTU1BTkRfTUFTVEVSKTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKLX0KLQotLyoKLSAqIHN0YXRpYyB2b2lkIGxheW91dF9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKLSAqCi0gKiBMYXlvdXQgbWVtb3J5IGFuZCBJL08gZm9yIGEgZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICogZGV2aWNlCS0gZGV2aWNlIHRvIGxheW91dCBtZW1vcnkgYW5kIEkvTyBmb3IuCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IGxheW91dF9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1bnNpZ25lZCBzaG9ydCBjbWQ7Ci0JdW5zaWduZWQgaW50IGJhc2UsIG1hc2ssIHNpemUsIHJlZzsKLQl1bnNpZ25lZCBpbnQgYWxpZ250bzsKLQlpbnQgaTsKLQotCS8qCi0JICogU2tpcCB2aWRlbyBjYXJkcyBpZiByZXF1ZXN0ZWQuCi0JICovCi0KLQlpZiAoKChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSkgfHwKLQkgICAgIChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBKSB8fAotCSAgICAgKGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfRElTUExBWV9YR0EpKSAmJiBza2lwX3ZnYSkKLQkJcmV0dXJuOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0KLQlmb3IgKHJlZyA9IFBDSV9CQVNFX0FERFJFU1NfMCwgaSA9IDA7IHJlZyA8PSBQQ0lfQkFTRV9BRERSRVNTXzU7IHJlZyArPSA0LCBpKyspCi0JewotCQkvKgotCQkgKiBGaWd1cmUgb3V0IGhvdyBtdWNoIHNwYWNlIGFuZCBvZiB3aGF0IHR5cGUgdGhpcwotCQkgKiBkZXZpY2Ugd2FudHMuCi0JCSAqLwotCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWcsIDB4ZmZmZmZmZmYpOwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCByZWcsICZiYXNlKTsKLQotCQlpZiAoIWJhc2UpCi0JCXsKLQkJCS8qIHRoaXMgYmFzZS1hZGRyZXNzIHJlZ2lzdGVyIGlzIHVudXNlZCAqLwotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyoKLQkJICogV2UndmUgcmVhZCB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGJhY2sgYWZ0ZXIKLQkJICogd3JpdGluZyBhbGwgb25lcyBhbmQgc28gbm93IHdlIG11c3QgZGVjb2RlIGl0LgotCQkgKi8KLQotCQlpZiAoYmFzZSAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pCi0JCXsKLQkJCS8qCi0JCQkgKiBJL08gc3BhY2UgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyLgotCQkJICovCi0KLQkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKLQotCQkJYmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQltYXNrID0gKH5iYXNlIDw8IDEpIHwgMHgxOwotCQkJc2l6ZSA9IChtYXNrICYgYmFzZSkgJiAweGZmZmZmZmZmOwotCi0JCQkvKgotCQkJICogQWxpZ24gdG8gbXVsdGlwbGUgb2Ygc2l6ZSBvZiBtaW5pbXVtIGJhc2UuCi0JCQkgKi8KLQotCQkJYWxpZ250byA9IG1heF90KHVuc2lnbmVkIGludCwgMHgwNDAsIHNpemUpOwotCQkJYmFzZSA9IEFMSUdOKGlvX2Jhc2UsIGFsaWdudG8pOwotCQkJaW9fYmFzZSA9IGJhc2UgKyBzaXplOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZywgYmFzZSB8IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pOwotCi0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gYmFzZTsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydCArIHNpemUgLSAxOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IElPUkVTT1VSQ0VfSU8gfCBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPOwotCi0JCQlEQkdfREVWUygoImxheW91dF9kZXY6IElPIGFkZHJlc3M6ICVsWFxuIiwgYmFzZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJdW5zaWduZWQgaW50IHR5cGU7Ci0KLQkJCS8qCi0JCQkgKiBNZW1vcnkgc3BhY2UgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyLgotCQkJICovCi0KLQkJCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JCQl0eXBlID0gYmFzZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSzsKLQkJCWJhc2UgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKLQkJCW1hc2sgPSAofmJhc2UgPDwgMSkgfCAweDE7Ci0JCQlzaXplID0gKG1hc2sgJiBiYXNlKSAmIDB4ZmZmZmZmZmY7Ci0JCQlzd2l0Y2ggKHR5cGUpCi0JCQl7Ci0JCQljYXNlIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzI6Ci0JCQljYXNlIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQ6Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV8xTToKLQkJCQlwcmludGsoImJpb3MzMiBXQVJOSU5HOiBzbG90ICVkLCBmdW5jdGlvbiAlZCAiCi0JCQkJICAgICAgICJyZXF1ZXN0cyBtZW1vcnkgYmVsb3cgMU1CLS0tZG9uJ3QgIgotCQkJCSAgICAgICAia25vdyBob3cgdG8gZG8gdGhhdC5cbiIsCi0JCQkJICAgICAgIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLAotCQkJCSAgICAgICBQQ0lfRlVOQyhkZXYtPmRldmZuKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBBbGlnbiB0byBtdWx0aXBsZSBvZiBzaXplIG9mIG1pbmltdW0gYmFzZS4KLQkJCSAqLwotCi0JCQlhbGlnbnRvID0gbWF4X3QodW5zaWduZWQgaW50LCAweDEwMDAsIHNpemUpOwotCQkJYmFzZSA9IEFMSUdOKG1lbV9iYXNlLCBhbGlnbnRvKTsKLQkJCW1lbV9iYXNlID0gYmFzZSArIHNpemU7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnLCBiYXNlKTsKLQotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IGJhc2U7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyBzaXplIC0gMTsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQotCQkJaWYgKHR5cGUgPT0gUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkKLQkJCXsKLQkJCQkvKgotCQkJCSAqIDY0LWJpdCBhZGRyZXNzLCBzZXQgdGhlIGhpZ2hlc3QgMzIgYml0cwotCQkJCSAqIHRvIHplcm8uCi0JCQkJICovCi0KLQkJCQlyZWcgKz0gNDsKLQkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnLCAwKTsKLQotCQkJCWkrKzsKLQkJCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7Ci0JCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEVuYWJsZSBkZXZpY2U6Ci0JICovCi0KLQlpZiAoZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19OT1RfREVGSU5FRCB8fAotCSAgICBkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSB8fAotCSAgICBkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBIHx8Ci0JICAgIGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfRElTUExBWV9YR0EpCi0JewotCQkvKgotCQkgKiBBbGwgb2YgdGhlc2UgKG1heSkgaGF2ZSBJL08gc2NhdHRlcmVkIGFsbCBhcm91bmQKLQkJICogYW5kIG1heSBub3QgdXNlIGkvby1iYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGF0IGFsbC4KLQkJICogU28gd2UganVzdCBoYXZlIHRvIGFsd2F5cyBlbmFibGUgSS9PIHRvIHRoZXNlCi0JCSAqIGRldmljZXMuCi0JCSAqLwotCQljbWQgfD0gUENJX0NPTU1BTkRfSU87Ci0JfQotCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCB8IFBDSV9DT01NQU5EX01BU1RFUik7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgKGRpc2FibGVfcGNpX2J1cnN0KSA/IDAgOiAzMik7Ci0KLQlpZiAoYnVzX2luZm8gIT0gTlVMTCkKLQkJYnVzX2luZm8tPmNvbmZfZGV2aWNlKGRldik7CS8qIE1hY2hpbmUgZGVwZW5kZW50IGNvbmZpZ3VyYXRpb24uICovCi0KLQlEQkdfREVWUygoImxheW91dF9kZXY6IGJ1cyAlZCAgc2xvdCAweCV4ICBWSUQgMHgleCAgRElEIDB4JXggIGNsYXNzIDB4JXhcbiIsCi0JCSAgZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksIGRldi0+dmVuZG9yLCBkZXYtPmRldmljZSwgZGV2LT5jbGFzcykpOwotfQotCi0vKgotICogc3RhdGljIHZvaWQgbGF5b3V0X2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotICoKLSAqIExheW91dCBtZW1vcnkgYW5kIEkvTyBmb3IgYWxsIGRldmljZXMgb24gdGhlIGdpdmVuIGJ1cy4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqIGJ1cwktIGJ1cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbGF5b3V0X2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXVuc2lnbmVkIGludCBiaW8sIGJtZW07Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQotCURCR19ERVZTKCgibGF5b3V0X2J1czogc3RhcnRpbmcgYnVzICVkXG4iLCBidXMtPm51bWJlcikpOwotCi0JaWYgKCFidXMtPmRldmljZXMgJiYgIWJ1cy0+Y2hpbGRyZW4pCi0JCXJldHVybjsKLQotCS8qCi0JICogQWxpZ24gdGhlIGN1cnJlbnQgYmFzZXMgb24gYXBwcm9wcmlhdGUgYm91bmRhcmllcyAoNEsgZm9yCi0JICogSU8gYW5kIDFNQiBmb3IgbWVtb3J5KS4KLQkgKi8KLQotCWJpbyA9IGlvX2Jhc2UgPSBBTElHTihpb19iYXNlLCA0KktCKTsKLQlibWVtID0gbWVtX2Jhc2UgPSBBTElHTihtZW1fYmFzZSwgMSpNQik7Ci0KLQkvKgotCSAqIFBDSSBkZXZpY2VzIG1pZ2h0IGhhdmUgYmVlbiBzZXR1cCBieSBhIFBDSSBCSU9TIGVtdWxhdGlvbgotCSAqIHJ1bm5pbmcgdW5kZXIgVE9TLiBJbiB0aGVzZSBjYXNlcyB0aGVyZSBpcyBhCi0JICogd2luZG93IGR1cmluZyB3aGljaCB0d28gZGV2aWNlcyBtYXkgaGF2ZSBhbiBvdmVybGFwcGluZwotCSAqIGFkZHJlc3MgcmFuZ2UuIFRvIGF2b2lkIHRoaXMgY2F1c2luZyB0cm91YmxlLCB3ZSBmaXJzdAotCSAqIHR1cm4gb2ZmIHRoZSBJL08gYW5kIG1lbW9yeSBhZGRyZXNzIGRlY29kZXJzIGZvciBhbGwgUENJCi0JICogZGV2aWNlcy4gIFRoZXknbGwgYmUgcmUtZW5hYmxlZCBvbmx5IG9uY2UgYWxsIGFkZHJlc3MKLQkgKiBkZWNvZGVycyBhcmUgcHJvZ3JhbW1lZCBjb25zaXN0ZW50bHkuCi0JICovCi0KLQlEQkdfREVWUygoImxheW91dF9idXM6IGRpc2FibGVfZGV2IGZvciBidXMgJWRcbiIsIGJ1cy0+bnVtYmVyKSk7Ci0KLQlmb3IgKGRldiA9IGJ1cy0+ZGV2aWNlczsgZGV2OyBkZXYgPSBkZXYtPnNpYmxpbmcpCi0JewotCQlpZiAoKGRldi0+Y2xhc3MgPj4gMTYgIT0gUENJX0JBU0VfQ0xBU1NfQlJJREdFKSB8fAotCQkgICAgKGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDTUNJQSkpCi0JCQlkaXNhYmxlX2RldihkZXYpOwotCX0KLQotCS8qCi0JICogQWxsb2NhdGUgc3BhY2UgdG8gZWFjaCBkZXZpY2U6Ci0JICovCi0KLQlEQkdfREVWUygoImxheW91dF9idXM6IHN0YXJ0aW5nIGJ1cyAlZCBkZXZpY2VzXG4iLCBidXMtPm51bWJlcikpOwotCi0JZm9yIChkZXYgPSBidXMtPmRldmljZXM7IGRldjsgZGV2ID0gZGV2LT5zaWJsaW5nKQotCXsKLQkJaWYgKChkZXYtPmNsYXNzID4+IDE2ICE9IFBDSV9CQVNFX0NMQVNTX0JSSURHRSkgfHwKLQkJICAgIChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0JSSURHRV9QQ01DSUEpKQotCQkJbGF5b3V0X2RldihkZXYpOwotCX0KLQotCURCR19ERVZTKCgibGF5b3V0X2J1czogYnVzICVkIGZpbmlzaGVkXG4iLCBidXMtPm51bWJlcikpOwotfQotCi0vKgotICogc3RhdGljIHZvaWQgcGNpYmlvc19maXh1cCh2b2lkKQotICoKLSAqIExheW91dCBtZW1vcnkgYW5kIEkvTyBvZiBhbGwgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpZiAncGNpX21vZGlmeScgaXMKLSAqIHRydWUuIFRoaXMgbWlnaHQgYmUgbmVjZXNzYXJ5IGJlY2F1c2Ugbm90IGV2ZXJ5IG02OGsgbWFjaGluZSB3aXRoIGEgUENJCi0gKiBidXMgaGFzIGEgUENJIEJJT1MuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlcgotICogcGNpX3NjYW5fYnVzKCkgaW4gcGNpYmlvc19pbml0KCkuCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfZml4dXAodm9pZCkKLXsKLQlpZiAocGNpX21vZGlmeSkKLQl7Ci0JCS8qCi0JCSAqIFNldCBiYXNlIGFkZHJlc3NlcyBmb3IgYWxsb2NhdGlvbiBvZiBJL08gYW5kIG1lbW9yeSBzcGFjZS4KLQkJICovCi0KLQkJaW9fYmFzZSA9IGJ1c19pbmZvLT5pb19zcGFjZS5zdGFydCArIElPX0FMTE9DX09GRlNFVDsKLQkJbWVtX2Jhc2UgPSBidXNfaW5mby0+bWVtX3NwYWNlLnN0YXJ0ICsgTUVNX0FMTE9DX09GRlNFVDsKLQotCQkvKgotCQkgKiBTY2FuIHRoZSB0cmVlLCBhbGxvY2F0aW5nIFBDSSBtZW1vcnkgYW5kIEkvTyBzcGFjZS4KLQkJICovCi0KLQkJbGF5b3V0X2J1cyhwY2lfYnVzX2IocGNpX3Jvb3QubmV4dCkpOwotCX0KLQotCS8qCi0JICogRml4IGludGVycnVwdCBhc3NpZ25tZW50cywgZXRjLgotCSAqLwotCi0JYnVzX2luZm8tPmZpeHVwKHBjaV9tb2RpZnkpOwotfQotCi0vKgotICogc3RhdGljIHZvaWQgcGNpYmlvc19jbGFpbV9yZXNvdXJjZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLSAqCi0gKiBDbGFpbSBhbGwgcmVzb3VyY2VzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGRldmljZXMgb24gdGhlIGdpdmVuIGJ1cy4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqIGJ1cwktIGJ1cy4KLSAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcGNpYmlvc19jbGFpbV9yZXNvdXJjZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCWludCBpOwotCi0Jd2hpbGUgKGJ1cykKLQl7Ci0JCWZvciAoZGV2ID0gYnVzLT5kZXZpY2VzOyAoZGV2ICE9IE5VTEwpOyBkZXYgPSBkZXYtPnNpYmxpbmcpCi0JCXsKLQkJCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKQotCQkJewotCQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCQkJCXN0cnVjdCByZXNvdXJjZSAqcHI7Ci0JCQkJc3RydWN0IHBjaV9idXNfaW5mbyAqYnVzX2luZm8gPSAoc3RydWN0IHBjaV9idXNfaW5mbyAqKSBkZXYtPnN5c2RhdGE7Ci0KLQkJCQlpZiAoKHItPnN0YXJ0ID09IDApIHx8IChyLT5wYXJlbnQgIT0gTlVMTCkpCi0JCQkJCWNvbnRpbnVlOwotI2lmIDEKLQkJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQkJCQlwciA9ICZidXNfaW5mby0+aW9fc3BhY2U7Ci0JCQkJZWxzZQotCQkJCQlwciA9ICZidXNfaW5mby0+bWVtX3NwYWNlOwotI2Vsc2UKLQkJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQkJCQlwciA9ICZpb3BvcnRfcmVzb3VyY2U7Ci0JCQkJZWxzZQotCQkJCQlwciA9ICZpb21lbV9yZXNvdXJjZTsKLSNlbmRpZgotCQkJCWlmIChyZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApCi0JCQkJewotCQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQWRkcmVzcyBzcGFjZSBjb2xsaXNpb24gb24gcmVnaW9uICVkIG9mIGRldmljZSAlc1xuIiwgaSwgZGV2LT5uYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVzLT5jaGlsZHJlbikKLQkJCXBjaWJpb3NfY2xhaW1fcmVzb3VyY2VzKGJ1cy0+Y2hpbGRyZW4pOwotCi0JCWJ1cyA9IGJ1cy0+bmV4dDsKLQl9Ci19Ci0KLS8qCi0gKiBpbnQgcGNpYmlvc19hc3NpZ25fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGkpCi0gKgotICogQXNzaWduIGEgbmV3IGFkZHJlc3MgdG8gYSBQQ0kgcmVzb3VyY2UuCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKiBkZXYJLSBkZXZpY2UuCi0gKiBpCS0gcmVzb3VyY2UuCi0gKgotICogUmVzdWx0OiAwIGlmIHN1Y2Nlc3NmdWwuCi0gKi8KLQotaW50IF9faW5pdCBwY2liaW9zX2Fzc2lnbl9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaSkKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gci0+ZW5kICsgMTsKLQotCWlmICghcHIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQl7Ci0JCWlmIChzaXplID4gMHgxMDApCi0JCQlyZXR1cm4gLUVGQklHOwotCi0JCWlmIChhbGxvY2F0ZV9yZXNvdXJjZShwciwgciwgc2l6ZSwgYnVzX2luZm8tPmlvX3NwYWNlLnN0YXJ0ICsKLQkJCQkgICAgICBJT19BTExPQ19PRkZTRVQsICBidXNfaW5mby0+aW9fc3BhY2UuZW5kLCAxMDI0KSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChhbGxvY2F0ZV9yZXNvdXJjZShwciwgciwgc2l6ZSwgYnVzX2luZm8tPm1lbV9zcGFjZS5zdGFydCArCi0JCQkJICAgICAgTUVNX0FMTE9DX09GRlNFVCwgYnVzX2luZm8tPm1lbV9zcGFjZS5lbmQsIHNpemUpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoaSA8IDYpCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAgKyA0ICogaSwgci0+c3RhcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19pbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQl2b2lkICpzeXNkYXRhOwotCi0Jc3lzZGF0YSA9IChidXMtPnBhcmVudCkgPyBidXMtPnBhcmVudC0+c3lzZGF0YSA6IGJ1cy0+c3lzZGF0YTsKLQotCWZvciAoZGV2ID0gYnVzLT5kZXZpY2VzOyAoZGV2ICE9IE5VTEwpOyBkZXYgPSBkZXYtPnNpYmxpbmcpCi0JCWRldi0+c3lzZGF0YSA9IHN5c2RhdGE7Ci19Ci0KLXZvaWQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQotewotCXByaW50aygiTGludXgvbTY4ayBQQ0kgQklPUzMyIHJldmlzaW9uICV4LiUwMnhcbiIsIE1BSk9SX1JFViwgTUlOT1JfUkVWKTsKLQotCWJ1c19pbmZvID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfSEFERVMKLQlpZiAoTUFDSF9JU19IQURFUykKLQkJYnVzX2luZm8gPSBpbml0X2hhZGVzX3BjaSgpOwotI2VuZGlmCi0JaWYgKGJ1c19pbmZvICE9IE5VTEwpCi0JewotCQlwcmludGsoIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmVcbiIpOwotCQlwY2lfc2Nhbl9idXMoMCwgYnVzX2luZm8tPm02OGtfcGNpX29wcywgYnVzX2luZm8pOwotCQlwY2liaW9zX2ZpeHVwKCk7Ci0JCXBjaWJpb3NfY2xhaW1fcmVzb3VyY2VzKHBjaV9yb290KTsKLQl9Ci0JZWxzZQotCQlwcmludGsoIlBDSTogTm8gUENJIGJ1cyBkZXRlY3RlZFxuIik7Ci19Ci0KLWNoYXIgKiBfX2luaXQgcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JaWYgKCFzdHJjbXAoc3RyLCAibm9tb2RpZnkiKSkKLQl7Ci0JCXBjaV9tb2RpZnkgPSAwOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChzdHIsICJza2lwdmdhIikpCi0JewotCQlza2lwX3ZnYSA9IDE7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmICghc3RyY21wKHN0ciwgIm5vYnVyc3QiKSkKLQl7Ci0JCWRpc2FibGVfcGNpX2J1cnN0ID0gMTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIHN0cjsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2RtYS5jIGIvYXJjaC9tNjhrL2tlcm5lbC9kbWEuYwppbmRleCA2ZjhjMDgwLi4yYmI0MjQ1IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2RtYS5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZG1hLmMKQEAgLTY2LDggKzY2LDggQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1hX2ZyZWVfY29oZXJlbnQpOwogCi1pbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQordm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLAorCQkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJc3dpdGNoIChkaXIpIHsKIAljYXNlIERNQV9UT19ERVZJQ0U6CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2ludHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCmluZGV4IGRlZDdkZDIuLjdlOGEwZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvaW50cy5jCkBAIC00MjksOCArNDI5LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiB2b2lkIGluaXRfaXJxX3Byb2Modm9pZCkKIHsKIAkvKiBJbnNlcnQgL3Byb2MvaXJxIGRyaXZlciBoZXJlICovCiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwppbmRleCA3ODg4Y2RmLi4zMDQyYzJiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzgsNyArNzgsNyBAQAogc3RhdGljIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCiB7CiAJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKLSNpZiBkZWZpbmVkKE1BQ0hfQVRBUklfT05MWSkgJiYgIWRlZmluZWQoQ09ORklHX0hBREVTKQorI2lmIGRlZmluZWQoTUFDSF9BVEFSSV9PTkxZKQogCQkvKiBibG9jayBvdXQgSFNZTkMgb24gdGhlIGF0YXJpIChmYWxjb24pICovCiAJCV9fYXNtX18oInN0b3AgIzB4MjIwMCIgOiA6IDogImNjIik7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCmluZGV4IDc1YjgzNDAuLjZkODEzZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKQEAgLTg4Myw4ICs4ODMsNyBAQAogCQkJaWYgKGkgJSA1ID09IDApCiAJCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKICNlbmRpZgotCQkJcHJpbnRrKCIgWzwlMDhseD5dIiwgYWRkcik7Ci0JCQlwcmludF9zeW1ib2woIiAlc1xuIiwgYWRkcik7CisJCQlwcmludGsoIiBbPCUwOGx4Pl0gJXBTXG4iLCBhZGRyLCAodm9pZCAqKWFkZHIpOwogCQkJaSsrOwogCQl9CiAJfQpAQCAtOTAwLDEwICs4OTksOCBAQAogCWludCBpOwogCiAJcHJpbnRfbW9kdWxlcygpOwotCXByaW50aygiUEM6IFs8JTA4bHg+XSIscmVncy0+cGMpOwotCXByaW50X3N5bWJvbCgiICVzIiwgcmVncy0+cGMpOwotCXByaW50aygiXG5TUjogJTA0eCAgU1A6ICVwICBhMjogJTA4bHhcbiIsCi0JICAgICAgIHJlZ3MtPnNyLCByZWdzLCByZWdzLT5hMik7CisJcHJpbnRrKCJQQzogWzwlMDhseD5dICVwU1xuIiwgcmVncy0+cGMsICh2b2lkICopcmVncy0+cGMpOworCXByaW50aygiU1I6ICUwNHggIFNQOiAlcCAgYTI6ICUwOGx4XG4iLCByZWdzLT5zciwgcmVncywgcmVncy0+YTIpOwogCXByaW50aygiZDA6ICUwOGx4ICAgIGQxOiAlMDhseCAgICBkMjogJTA4bHggICAgZDM6ICUwOGx4XG4iLAogCSAgICAgICByZWdzLT5kMCwgcmVncy0+ZDEsIHJlZ3MtPmQyLCByZWdzLT5kMyk7CiAJcHJpbnRrKCJkNDogJTA4bHggICAgZDU6ICUwOGx4ICAgIGEwOiAlMDhseCAgICBhMTogJTA4bHhcbiIsCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcyBiL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdGQubGRzCmluZGV4IDk5YjA3ODQuLmY4NDZkNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdGQubGRzCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdGQubGRzCkBAIC0zNCwxMCArMzQsMTAgQEAKIAlDT05TVFJVQ1RPUlMKIAl9CiAKLSAgLmJzcyA6IHsgKiguYnNzKSB9CQkvKiBCU1MgKi8KLQogICAuID0gQUxJR04oMTYpOwotICAuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsgKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgfSA6ZGF0YQorICAuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsgKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgfQorCisgIC5ic3MgOiB7ICooLmJzcykgfQkJLyogQlNTICovCiAKICAgX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlfc2luaXR0ZXh0ID0gLjsKIAlJTklUX1RFWFQKIAlfZWluaXR0ZXh0ID0gLjsKLSAgfQorICB9IDpkYXRhCiAgIC5pbml0LmRhdGEgOiB7IElOSVRfREFUQSB9CiAgIC4gPSBBTElHTigxNik7CiAgIF9fc2V0dXBfc3RhcnQgPSAuOwpAQCAtNzQsNiArNzQsNyBAQAogICAuaW5pdC5yYW1mcyA6IHsgKiguaW5pdC5yYW1mcykgfQogICBfX2luaXRyYW1mc19lbmQgPSAuOwogI2VuZGlmCisgIE5PVEVTCiAgIC4gPSBBTElHTig4MTkyKTsKICAgX19pbml0X2VuZCA9IC47CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9rbWFwLmMgYi9hcmNoL202OGsvbW0va21hcC5jCmluZGV4IDQ2YjdkNjAuLmRmNjIwYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tbS9rbWFwLmMKKysrIGIvYXJjaC9tNjhrL21tL2ttYXAuYwpAQCAtNjYsOCArNjYsMTAgQEAKIAlmb3IgKHAgPSAmaW9saXN0OyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKIAkJaWYgKHNpemUgKyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyKQogCQkJYnJlYWs7Ci0JCWlmIChhZGRyID4gS01BUF9FTkQtc2l6ZSkKKwkJaWYgKGFkZHIgPiBLTUFQX0VORC1zaXplKSB7CisJCQlrZnJlZShhcmVhKTsKIAkJCXJldHVybiBOVUxMOworCQl9CiAJCWFkZHIgPSB0bXAtPnNpemUgKyAodW5zaWduZWQgbG9uZyl0bXAtPmFkZHI7CiAJfQogCWFyZWEtPmFkZHIgPSAodm9pZCAqKWFkZHI7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbXZtZTE2eC9ydGMuYyBiL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCmluZGV4IDQzMmE5ZjEuLmNlYTVlM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCisrKyBiL2FyY2gvbTY4ay9tdm1lMTZ4L3J0Yy5jCkBAIC01MiwxNSArNTIsMTUgQEAKIAkJLyogRW5zdXJlIGNsb2NrIGFuZCByZWFsLXRpbWUtbW9kZS1yZWdpc3RlciBhcmUgYWNjZXNzaWJsZSAqLwogCQlydGMtPmN0cmwgPSBSVENfUkVBRDsKIAkJbWVtc2V0KCZ3dGltZSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOwotCQl3dGltZS50bV9zZWMgPSAgQkNEMkJJTihydGMtPmJjZF9zZWMpOwotCQl3dGltZS50bV9taW4gPSAgQkNEMkJJTihydGMtPmJjZF9taW4pOwotCQl3dGltZS50bV9ob3VyID0gQkNEMkJJTihydGMtPmJjZF9ocik7Ci0JCXd0aW1lLnRtX21kYXkgPSAgQkNEMkJJTihydGMtPmJjZF9kb20pOwotCQl3dGltZS50bV9tb24gPSAgQkNEMkJJTihydGMtPmJjZF9tdGgpLTE7Ci0JCXd0aW1lLnRtX3llYXIgPSBCQ0QyQklOKHJ0Yy0+YmNkX3llYXIpOworCQl3dGltZS50bV9zZWMgPSAgYmNkMmJpbihydGMtPmJjZF9zZWMpOworCQl3dGltZS50bV9taW4gPSAgYmNkMmJpbihydGMtPmJjZF9taW4pOworCQl3dGltZS50bV9ob3VyID0gYmNkMmJpbihydGMtPmJjZF9ocik7CisJCXd0aW1lLnRtX21kYXkgPSAgYmNkMmJpbihydGMtPmJjZF9kb20pOworCQl3dGltZS50bV9tb24gPSAgYmNkMmJpbihydGMtPmJjZF9tdGgpLTE7CisJCXd0aW1lLnRtX3llYXIgPSBiY2QyYmluKHJ0Yy0+YmNkX3llYXIpOwogCQlpZiAod3RpbWUudG1feWVhciA8IDcwKQogCQkJd3RpbWUudG1feWVhciArPSAxMDA7Ci0JCXd0aW1lLnRtX3dkYXkgPSBCQ0QyQklOKHJ0Yy0+YmNkX2RvdyktMTsKKwkJd3RpbWUudG1fd2RheSA9IGJjZDJiaW4ocnRjLT5iY2RfZG93KS0xOwogCQlydGMtPmN0cmwgPSAwOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJnd0aW1lLCBzaXplb2Ygd3RpbWUpID8KQEAgLTEwNCwxMiArMTA0LDEyIEBACiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJcnRjLT5jdHJsICAgICA9IFJUQ19XUklURTsKIAotCQlydGMtPmJjZF9zZWMgID0gQklOMkJDRChzZWMpOwotCQlydGMtPmJjZF9taW4gID0gQklOMkJDRChtaW4pOwotCQlydGMtPmJjZF9ociAgID0gQklOMkJDRChocnMpOwotCQlydGMtPmJjZF9kb20gID0gQklOMkJDRChkYXkpOwotCQlydGMtPmJjZF9tdGggID0gQklOMkJDRChtb24pOwotCQlydGMtPmJjZF95ZWFyID0gQklOMkJDRCh5cnMlMTAwKTsKKwkJcnRjLT5iY2Rfc2VjICA9IGJpbjJiY2Qoc2VjKTsKKwkJcnRjLT5iY2RfbWluICA9IGJpbjJiY2QobWluKTsKKwkJcnRjLT5iY2RfaHIgICA9IGJpbjJiY2QoaHJzKTsKKwkJcnRjLT5iY2RfZG9tICA9IGJpbjJiY2QoZGF5KTsKKwkJcnRjLT5iY2RfbXRoICA9IGJpbjJiY2QobW9uKTsKKwkJcnRjLT5iY2RfeWVhciA9IGJpbjJiY2QoeXJzJTEwMCk7CiAKIAkJcnRjLT5jdHJsICAgICA9IDA7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCmluZGV4IGJlOWRlMmYuLjljN2VlZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3E0MC9jb25maWcuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CkBAIC0yMTYsMTcgKzIxNyw2IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGJjZDJiaW4odW5zaWduZWQgY2hhciBiKQotewotCXJldHVybiAoYiA+PiA0KSAqIDEwICsgKGIgJiAxNSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBiaW4yYmNkKHVuc2lnbmVkIGNoYXIgYikKLXsKLQlyZXR1cm4gKGIgLyAxMCkgKiAxNiArIChiICUgMTApOwotfQotCi0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHE0MF9nZXR0aW1lb2Zmc2V0KHZvaWQpCiB7CiAJcmV0dXJuIDUwMDAgKiAocWxfdGlja3MgIT0gMCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuM3gvdGltZS5jIGIvYXJjaC9tNjhrL3N1bjN4L3RpbWUuYwppbmRleCBmNWVhYWZiLi41MzZhMDRhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuM3gvdGltZS5jCisrKyBiL2FyY2gvbTY4ay9zdW4zeC90aW1lLmMKQEAgLTQ3LDIzICs0NywyMyBAQAogCiAJaWYoc2V0KSB7CiAJCWgtPmNzciB8PSBDX1dSSVRFOwotCQloLT5zZWMgPSBCSU4yQkNEKHQtPnRtX3NlYyk7Ci0JCWgtPm1pbiA9IEJJTjJCQ0QodC0+dG1fbWluKTsKLQkJaC0+aG91ciA9IEJJTjJCQ0QodC0+dG1faG91cik7Ci0JCWgtPndkYXkgPSBCSU4yQkNEKHQtPnRtX3dkYXkpOwotCQloLT5tZGF5ID0gQklOMkJDRCh0LT50bV9tZGF5KTsKLQkJaC0+bW9udGggPSBCSU4yQkNEKHQtPnRtX21vbik7Ci0JCWgtPnllYXIgPSBCSU4yQkNEKHQtPnRtX3llYXIpOworCQloLT5zZWMgPSBiaW4yYmNkKHQtPnRtX3NlYyk7CisJCWgtPm1pbiA9IGJpbjJiY2QodC0+dG1fbWluKTsKKwkJaC0+aG91ciA9IGJpbjJiY2QodC0+dG1faG91cik7CisJCWgtPndkYXkgPSBiaW4yYmNkKHQtPnRtX3dkYXkpOworCQloLT5tZGF5ID0gYmluMmJjZCh0LT50bV9tZGF5KTsKKwkJaC0+bW9udGggPSBiaW4yYmNkKHQtPnRtX21vbik7CisJCWgtPnllYXIgPSBiaW4yYmNkKHQtPnRtX3llYXIpOwogCQloLT5jc3IgJj0gfkNfV1JJVEU7CiAJfSBlbHNlIHsKIAkJaC0+Y3NyIHw9IENfUkVBRDsKLQkJdC0+dG1fc2VjID0gQkNEMkJJTihoLT5zZWMpOwotCQl0LT50bV9taW4gPSBCQ0QyQklOKGgtPm1pbik7Ci0JCXQtPnRtX2hvdXIgPSBCQ0QyQklOKGgtPmhvdXIpOwotCQl0LT50bV93ZGF5ID0gQkNEMkJJTihoLT53ZGF5KTsKLQkJdC0+dG1fbWRheSA9IEJDRDJCSU4oaC0+bWRheSk7Ci0JCXQtPnRtX21vbiA9IEJDRDJCSU4oaC0+bW9udGgpOwotCQl0LT50bV95ZWFyID0gQkNEMkJJTihoLT55ZWFyKTsKKwkJdC0+dG1fc2VjID0gYmNkMmJpbihoLT5zZWMpOworCQl0LT50bV9taW4gPSBiY2QyYmluKGgtPm1pbik7CisJCXQtPnRtX2hvdXIgPSBiY2QyYmluKGgtPmhvdXIpOworCQl0LT50bV93ZGF5ID0gYmNkMmJpbihoLT53ZGF5KTsKKwkJdC0+dG1fbWRheSA9IGJjZDJiaW4oaC0+bWRheSk7CisJCXQtPnRtX21vbiA9IGJjZDJiaW4oaC0+bW9udGgpOworCQl0LT50bV95ZWFyID0gYmNkMmJpbihoLT55ZWFyKTsKIAkJaC0+Y3NyICY9IH5DX1JFQUQ7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDU4N2RhNWUuLmY1ZjgzZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC0yMiw2ICsyMiw5IEBACiBjb25maWcgUFBDX01FUkdFCiAJZGVmX2Jvb2wgeQogCitjb25maWcgQVJDSF9QSFlTX0FERFJfVF82NEJJVAorICAgICAgIGRlZl9ib29sIFBQQzY0IHx8IFBIWVNfNjRCSVQKKwogY29uZmlnIE1NVQogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90eXBlcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3R5cGVzLmgKaW5kZXggZDMzNzRiYy4uYzY0NmYzNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3R5cGVzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3R5cGVzLmgKQEAgLTQ4LDEzICs0OCw2IEBACiAKIHR5cGVkZWYgX192ZWN0b3IxMjggdmVjdG9yMTI4OwogCi0vKiBQaHlzaWNhbCBhZGRyZXNzIHVzZWQgYnkgc29tZSBJTyBmdW5jdGlvbnMgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QUEM2NCkgfHwgZGVmaW5lZChDT05GSUdfUEhZU182NEJJVCkKLXR5cGVkZWYgdTY0IHBoeXNfYWRkcl90OwotI2Vsc2UKLXR5cGVkZWYgdTMyIHBoeXNfYWRkcl90OwotI2VuZGlmCi0KICNpZmRlZiBfX3Bvd2VycGM2NF9fCiB0eXBlZGVmIHU2NCBkbWFfYWRkcl90OwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKaW5kZXggN2Y2NTEyNy4uYmU4NTJmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKQEAgLTEzNSw3ICsxMzUsNiBAQAogY29uZmlnIFBIWVNfNjRCSVQKIAlib29sICdMYXJnZSBwaHlzaWNhbCBhZGRyZXNzIHN1cHBvcnQnIGlmIEU1MDAKIAlkZXBlbmRzIG9uIDQ0eCB8fCBFNTAwCi0Jc2VsZWN0IFJFU09VUkNFU182NEJJVAogCWRlZmF1bHQgeSBpZiA0NHgKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciBsYXJnZXIgdGhhbiAzMi1iaXQgcGh5c2ljYWwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmMKaW5kZXggZmIzNjhkZi4uZThhNzZkOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmMKQEAgLTQxLDEzICs0MSwxMCBAQAogI2RlZmluZSBVNjRfVE9fVTMyX0xPVyh2YWwpCSgodTMyKSgodmFsKSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCkpCiAjZGVmaW5lIFU2NF9UT19VMzJfSElHSCh2YWwpCSgodTMyKSgodmFsKSA+PiAzMikpCiAKLSNpZmRlZiBDT05GSUdfUkVTT1VSQ0VTXzY0QklUCi0jZGVmaW5lIFJFU19UT19VMzJfTE9XKHZhbCkJVTY0X1RPX1UzMl9MT1codmFsKQotI2RlZmluZSBSRVNfVE9fVTMyX0hJR0godmFsKQlVNjRfVE9fVTMyX0hJR0godmFsKQotI2Vsc2UKLSNkZWZpbmUgUkVTX1RPX1UzMl9MT1codmFsKQkodmFsKQotI2RlZmluZSBSRVNfVE9fVTMyX0hJR0godmFsKQkoMCkKLSNlbmRpZgorI2RlZmluZSBSRVNfVE9fVTMyX0xPVyh2YWwpCVwKKwkoKHNpemVvZihyZXNvdXJjZV9zaXplX3QpID4gc2l6ZW9mKHUzMikpID8gVTY0X1RPX1UzMl9MT1codmFsKSA6ICh2YWwpKQorI2RlZmluZSBSRVNfVE9fVTMyX0hJR0godmFsKQlcCisJKChzaXplb2YocmVzb3VyY2Vfc2l6ZV90KSA+IHNpemVvZih1MzIpKSA/IFU2NF9UT19VMzJfSElHSCh2YWwpIDogKDApKQogCiBzdGF0aWMgaW5saW5lIGludCBwcGM0NDBzcGVfcmV2QSh2b2lkKQogewpAQCAtMTQ1LDEyICsxNDIsMTEgQEAKIAogCQkvKiBVc2UgdGhhdCAqLwogCQlyZXMtPnN0YXJ0ID0gcGNpX2FkZHI7Ci0jaWZuZGVmIENPTkZJR19SRVNPVVJDRVNfNjRCSVQKIAkJLyogQmV3YXJlIG9mIDMyIGJpdHMgcmVzb3VyY2VzICovCi0JCWlmICgocGNpX2FkZHIgKyBzaXplKSA+IDB4MTAwMDAwMDAwdWxsKQorCQlpZiAoc2l6ZW9mKHJlc291cmNlX3NpemVfdCkgPT0gc2l6ZW9mKHUzMikgJiYKKwkJICAgIChwY2lfYWRkciArIHNpemUpID4gMHgxMDAwMDAwMDB1bGwpCiAJCQlyZXMtPmVuZCA9IDB4ZmZmZmZmZmY7CiAJCWVsc2UKLSNlbmRpZgogCQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgc2l6ZSAtIDE7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGY2NWMyNzQuLjgzN2E5YWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtOTQ3LDEzICs5NDcsMTUgQEAKIAlkZWZfYm9vbCBuCiAJcHJvbXB0ICJQQUUgKFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9uKSBTdXBwb3J0IgogCWRlcGVuZHMgb24gWDg2XzMyICYmICFISUdITUVNNEcKLQlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCiAJaGVscAogCSAgUEFFIGlzIHJlcXVpcmVkIGZvciBOWCBzdXBwb3J0LCBhbmQgZnVydGhlcm1vcmUgZW5hYmxlcwogCSAgbGFyZ2VyIHN3YXBzcGFjZSBzdXBwb3J0IGZvciBub24tb3ZlcmNvbW1pdCBwdXJwb3Nlcy4gSXQKIAkgIGhhcyB0aGUgY29zdCBvZiBtb3JlIHBhZ2V0YWJsZSBsb29rdXAgb3ZlcmhlYWQsIGFuZCBhbHNvCiAJICBjb25zdW1lcyBtb3JlIHBhZ2V0YWJsZSBzcGFjZSBwZXIgcHJvY2Vzcy4KIAorY29uZmlnIEFSQ0hfUEhZU19BRERSX1RfNjRCSVQKKyAgICAgICBkZWZfYm9vbCBYODZfNjQgfHwgWDg2X1BBRQorCiAjIENvbW1vbiBOVU1BIEZlYXR1cmVzCiBjb25maWcgTlVNQQogCWJvb2wgIk51bWEgTWVtb3J5IEFsbG9jYXRpb24gYW5kIFNjaGVkdWxlciBTdXBwb3J0IChFWFBFUklNRU5UQUwpIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKaW5kZXggNzhlNjQyZi4uY2U5N2JmMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCkBAIC0xMjgyLDEyICsxMjgyLDEwIEBACiAJZTgyMF9yZXMgPSByZXM7CiAJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKIAkJZW5kID0gZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUgLSAxOwotI2lmbmRlZiBDT05GSUdfUkVTT1VSQ0VTXzY0QklUCi0JCWlmIChlbmQgPiAweDEwMDAwMDAwMFVMTCkgeworCQlpZiAoZW5kICE9IChyZXNvdXJjZV9zaXplX3QpZW5kKSB7CiAJCQlyZXMrKzsKIAkJCWNvbnRpbnVlOwogCQl9Ci0jZW5kaWYKIAkJcmVzLT5uYW1lID0gZTgyMF90eXBlX3RvX3N0cmluZyhlODIwLm1hcFtpXS50eXBlKTsKIAkJcmVzLT5zdGFydCA9IGU4MjAubWFwW2ldLmFkZHI7CiAJCXJlcy0+ZW5kID0gZW5kOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3J0Yy5jIGIvYXJjaC94ODYva2VybmVsL3J0Yy5jCmluZGV4IDA1MTkxYmIuLjBhMjNiNTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ydGMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMKQEAgLTIyMywxMSArMjIzLDI1IEBACiBzdGF0aWMgX19pbml0IGludCBhZGRfcnRjX2Ntb3Modm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUE5QCi0JaWYgKCFwbnBfcGxhdGZvcm1fZGV2aWNlcykKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZydGNfZGV2aWNlKTsKLSNlbHNlCisJc3RhdGljIGNvbnN0IGNoYXIgKmlkc1tdIF9faW5pdGNvbnN0ID0KKwkgICAgeyAiUE5QMGIwMCIsICJQTlAwYjAxIiwgIlBOUDBiMDIiLCB9OworCXN0cnVjdCBwbnBfZGV2ICpkZXY7CisJc3RydWN0IHBucF9pZCAqaWQ7CisJaW50IGk7CisKKwlwbnBfZm9yX2VhY2hfZGV2KGRldikgeworCQlmb3IgKGlkID0gZGV2LT5pZDsgaWQ7IGlkID0gaWQtPm5leHQpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlkcyk7IGkrKykgeworCQkJCWlmIChjb21wYXJlX3BucF9pZChpZCwgaWRzW2ldKSAhPSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZydGNfZGV2aWNlKTsKLSNlbmRpZiAvKiBDT05GSUdfUE5QICovCisJZGV2X2luZm8oJnJ0Y19kZXZpY2UuZGV2LAorCQkgInJlZ2lzdGVyZWQgcGxhdGZvcm0gUlRDIGRldmljZSAobm8gUE5QIGRldmljZSBmb3VuZClcbiIpOwogCXJldHVybiAwOwogfQogZGV2aWNlX2luaXRjYWxsKGFkZF9ydGNfY21vcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMgYi9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMKaW5kZXggZTRjNDNlYy4uYWU3MWUxMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW9yZW1hcC5jCisrKyBiL2FyY2gveDg2L21tL2lvcmVtYXAuYwpAQCAtMjIwLDYgKzIyMCwxMiBAQAogCQlyZXR1cm4gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAKIAkvKgorCSAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IHNwYW5zIG1vcmUgdGhhbiBhbnkgQkFSIGluIHRoZSBpb21lbSByZXNvdXJjZQorCSAqIHRyZWUuCisJICovCisJV0FSTl9PTihpb21lbV9tYXBfc2FuaXR5X2NoZWNrKHBoeXNfYWRkciwgc2l6ZSkpOworCisJLyoKIAkgKiBEb24ndCBhbGxvdyBhbnlib2R5IHRvIHJlbWFwIG5vcm1hbCBSQU0gdGhhdCB3ZSdyZSB1c2luZy4uCiAJICovCiAJZm9yIChwZm4gPSBwaHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDNjNTc4ZWYuLjI0NjQ5YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMjYwLDExNSArMjYwLDMgQEAKIH0KIAogYXJjaF9pbml0Y2FsbChpbml0X2FjcGlfZGV2aWNlX25vdGlmeSk7Ci0KLQotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQ01PUykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9DTU9TX01PRFVMRSkKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIHUzMiBydGNfaGFuZGxlcih2b2lkICpjb250ZXh0KQotewotCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOwotCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Ci0JcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBydGNfd2FrZV9zZXR1cCh2b2lkKQotewotCWFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfUlRDLCBydGNfaGFuZGxlciwgTlVMTCk7Ci0JLyoKLQkgKiBBZnRlciB0aGUgUlRDIGhhbmRsZXIgaXMgaW5zdGFsbGVkLCB0aGUgRml4ZWRfUlRDIGV2ZW50IHNob3VsZAotCSAqIGJlIGRpc2FibGVkLiBPbmx5IHdoZW4gdGhlIFJUQyBhbGFybSBpcyBzZXQgd2lsbCBpdCBiZSBlbmFibGVkLgotCSAqLwotCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOwotCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0Y193YWtlX29uKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUlRDKTsKLQlhY3BpX2VuYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0Y193YWtlX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JYWNwaV9kaXNhYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKLX0KLSNlbHNlCi0jZGVmaW5lIHJ0Y193YWtlX3NldHVwKCkJZG97fXdoaWxlKDApCi0jZGVmaW5lIHJ0Y193YWtlX29uCQlOVUxMCi0jZGVmaW5lIHJ0Y193YWtlX29mZgkJTlVMTAotI2VuZGlmCi0KLS8qIEV2ZXJ5IEFDUEkgcGxhdGZvcm0gaGFzIGEgbWMxNDY4MTggY29tcGF0aWJsZSAiY21vcyBydGMiLiAgSGVyZSB3ZSBmaW5kCi0gKiBpdHMgZGV2aWNlIG5vZGUgYW5kIHBhc3MgZXh0cmEgY29uZmlnIGRhdGEuICBUaGlzIGhlbHBzIGl0cyBkcml2ZXIgdXNlCi0gKiBjYXBhYmlsaXRpZXMgdGhhdCB0aGUgbm93LW9ic29sZXRlIG1jMTQ2ODE4IGRpZG4ndCBoYXZlLCBhbmQgaW5mb3JtcyBpdAotICogdGhhdCB0aGlzIGJvYXJkJ3MgUlRDIGlzIHdha2V1cC1jYXBhYmxlIChwZXIgQUNQSSBzcGVjKS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgY21vc19ydGNfYm9hcmRfaW5mbyBydGNfaW5mbzsKLQotCi0vKiBQTlAgZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCBpbiBhIHN1YnN5c19pbml0Y2FsbCgpOwotICogQUNQSSBzcGVjaWZpZXMgdGhlIFBOUCBJRHMgdG8gdXNlLgotICovCi0jaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBucF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmlkc1tdID0geyAiUE5QMGIwMCIsICJQTlAwYjAxIiwgIlBOUDBiMDIiLCB9OwotCXN0cnVjdCBwbnBfZGV2ICpwbnAgPSB0b19wbnBfZGV2KGRldik7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZHMpOyBpKyspIHsKLQkJaWYgKGNvbXBhcmVfcG5wX2lkKHBucC0+aWQsIGlkc1tpXSkgIT0gMCkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgKl9faW5pdCBnZXRfcnRjX2Rldih2b2lkKQotewotCXJldHVybiBidXNfZmluZF9kZXZpY2UoJnBucF9idXNfdHlwZSwgTlVMTCwgTlVMTCwgcG5wX21hdGNoKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9ydGNfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdldF9ydGNfZGV2KCk7Ci0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGV2KSB7Ci0JCXJ0Y193YWtlX3NldHVwKCk7Ci0JCXJ0Y19pbmZvLndha2Vfb24gPSBydGNfd2FrZV9vbjsKLQkJcnRjX2luZm8ud2FrZV9vZmYgPSBydGNfd2FrZV9vZmY7Ci0KLQkJLyogd29ya2Fyb3VuZCBidWcgaW4gc29tZSBBQ1BJIHRhYmxlcyAqLwotCQlpZiAoYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSAmJiAhYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pIHsKLQkJCURCRygiYm9ndXMgRkFEVCBtb250aF9hbGFybVxuIik7Ci0JCQlhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtID0gMDsKLQkJfQotCi0JCXJ0Y19pbmZvLnJ0Y19kYXlfYWxhcm0gPSBhY3BpX2dibF9GQURULmRheV9hbGFybTsKLQkJcnRjX2luZm8ucnRjX21vbl9hbGFybSA9IGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm07Ci0JCXJ0Y19pbmZvLnJ0Y19jZW50dXJ5ID0gYWNwaV9nYmxfRkFEVC5jZW50dXJ5OwotCi0JCS8qIE5PVEU6ICBTNF9SVENfV0FLRSBpcyBOT1QgY3VycmVudGx5IHVzZWZ1bCB0byBMaW51eCAqLwotCQlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9TNF9SVENfV0FLRSkKLQkJCXByaW50ayhQUkVGSVggIlJUQyBjYW4gd2FrZSBmcm9tIFM0XG4iKTsKLQotCi0JCWRldi0+cGxhdGZvcm1fZGF0YSA9ICZydGNfaW5mbzsKLQotCQkvKiBSVEMgYWx3YXlzIHdha2VzIGZyb20gUzEvUzIvUzMsIGFuZCBvZnRlbiBTNC9TVEQgKi8KLQkJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7Ci0KLQkJcHV0X2RldmljZShkZXYpOwotCX0gZWxzZQotCQlEQkcoIlJUQyB1bmF2YWlsYWJsZT9cbiIpOwotCXJldHVybiAwOwotfQotbW9kdWxlX2luaXQoYWNwaV9ydGNfaW5pdCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hdGFmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwppbmRleCA0OWYyNzQxLi40MzJjZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwpAQCAtMTg4MiwxMCArMTg4Miw2IEBACiAJCS8qIEFtaWdhLCBNYWMsIC4uLiBkb24ndCBoYXZlIEF0YXJpLWNvbXBhdGlibGUgZmxvcHB5IDotKSAqLwogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChNQUNIX0lTX0hBREVTKQotCQkvKiBIYWRlcyBkb2Vzbid0IGhhdmUgQXRhcmktY29tcGF0aWJsZSBmbG9wcHkgKi8KLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlpZiAocmVnaXN0ZXJfYmxrZGV2KEZMT1BQWV9NQUpPUiwiZmQiKSkKIAkJcmV0dXJuIC1FQlVTWTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Z0LmMgYi9kcml2ZXJzL2NoYXIvdnQuYwppbmRleCA1NzAyOWZlLi5hMGY3ZmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdnQuYworKysgYi9kcml2ZXJzL2NoYXIvdnQuYwpAQCAtMzAxLDcgKzMwMSw3IEBACiAJZCA9ICh1bnNpZ25lZCBzaG9ydCAqKSh2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogdCk7CiAJcyA9ICh1bnNpZ25lZCBzaG9ydCAqKSh2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogKHQgKyBucikpOwogCXNjcl9tZW1tb3ZldyhkLCBzLCAoYiAtIHQgLSBucikgKiB2Yy0+dmNfc2l6ZV9yb3cpOwotCXNjcl9tZW1zZXR3KGQgKyAoYiAtIHQgLSBucikgKiB2Yy0+dmNfY29scywgdmMtPnZjX3NjcmxfZXJhc2VfY2hhciwKKwlzY3JfbWVtc2V0dyhkICsgKGIgLSB0IC0gbnIpICogdmMtPnZjX2NvbHMsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLAogCQkgICAgdmMtPnZjX3NpemVfcm93ICogbnIpOwogfQogCkBAIC0zMTksNyArMzE5LDcgQEAKIAlzID0gKHVuc2lnbmVkIHNob3J0ICopKHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfc2l6ZV9yb3cgKiB0KTsKIAlzdGVwID0gdmMtPnZjX2NvbHMgKiBucjsKIAlzY3JfbWVtbW92ZXcocyArIHN0ZXAsIHMsIChiIC0gdCAtIG5yKSAqIHZjLT52Y19zaXplX3Jvdyk7Ci0Jc2NyX21lbXNldHcocywgdmMtPnZjX3NjcmxfZXJhc2VfY2hhciwgMiAqIHN0ZXApOworCXNjcl9tZW1zZXR3KHMsIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLCAyICogc3RlcCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX3VwZGF0ZV9yZWdpb24oc3RydWN0IHZjX2RhdGEgKnZjLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgY291bnQpCkBAIC00MzQsNyArNDM0LDYgQEAKIAkgICAgICAgICAgICAgIHZjLT52Y19ibGluaywgdmMtPnZjX3VuZGVybGluZSwKIAkgICAgICAgICAgICAgIHZjLT52Y19yZXZlcnNlIF4gdmMtPnZjX2RlY3Njbm0sIHZjLT52Y19pdGFsaWMpOwogCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0gKGJ1aWxkX2F0dHIodmMsIHZjLT52Y19jb2xvciwgMSwgdmMtPnZjX2JsaW5rLCAwLCB2Yy0+dmNfZGVjc2NubSwgMCkgPDwgOCkgfCAnICc7Ci0JdmMtPnZjX3NjcmxfZXJhc2VfY2hhciA9IChidWlsZF9hdHRyKHZjLCB2Yy0+dmNfZGVmX2NvbG9yLCAxLCBmYWxzZSwgZmFsc2UsIHZjLT52Y19kZWNzY25tLCBmYWxzZSkgPDwgOCkgfCAnICc7CiB9CiAKIC8qIE5vdGU6IGludmVydGluZyB0aGUgc2NyZWVuIHR3aWNlIHNob3VsZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggNDU1NTc1Yi4uM2U1MjZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogc3RhdGljIGNoYXIgZG1pX2VtcHR5X3N0cmluZ1tdID0gIiAgICAgICAgIjsKIAorLyoKKyAqIENhdGNoIHRvbyBlYXJseSBjYWxscyB0byBkbWlfY2hlY2tfc3lzdGVtKCk6CisgKi8KK3N0YXRpYyBpbnQgZG1pX2luaXRpYWxpemVkOworCiBzdGF0aWMgY29uc3QgY2hhciAqIF9faW5pdCBkbWlfc3RyaW5nX25vc2F2ZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIHU4IHMpCiB7CiAJY29uc3QgdTggKmJwID0gKCh1OCAqKSBkbSkgKyBkbS0+bGVuZ3RoOwpAQCAtMzY2LDcgKzM3MSw3IEBACiAKIAlpZiAoZWZpX2VuYWJsZWQpIHsKIAkJaWYgKGVmaS5zbWJpb3MgPT0gRUZJX0lOVkFMSURfVEFCTEVfQUREUikKLQkJCWdvdG8gb3V0OworCQkJZ290byBlcnJvcjsKIAogCQkvKiBUaGlzIGlzIGNhbGxlZCBhcyBhIGNvcmVfaW5pdGNhbGwoKSBiZWNhdXNlIGl0IGlzbid0CiAJCSAqIG5lZWRlZCBkdXJpbmcgZWFybHkgYm9vdC4gIFRoaXMgYWxzbyBtZWFucyB3ZSBjYW4KQEAgLTM3NCwxMyArMzc5LDEzIEBACiAJCSAqLwogCQlwID0gZG1pX2lvcmVtYXAoZWZpLnNtYmlvcywgMzIpOwogCQlpZiAocCA9PSBOVUxMKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIGVycm9yOwogCiAJCXJjID0gZG1pX3ByZXNlbnQocCArIDB4MTApOyAvKiBvZmZzZXQgb2YgX0RNSV8gc3RyaW5nICovCiAJCWRtaV9pb3VubWFwKHAsIDMyKTsKIAkJaWYgKCFyYykgewogCQkJZG1pX2F2YWlsYWJsZSA9IDE7Ci0JCQlyZXR1cm47CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAllbHNlIHsKQEAgLTM5MSwxOSArMzk2LDIyIEBACiAJCSAqLwogCQlwID0gZG1pX2lvcmVtYXAoMHhGMDAwMCwgMHgxMDAwMCk7CiAJCWlmIChwID09IE5VTEwpCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZXJyb3I7CiAKIAkJZm9yIChxID0gcDsgcSA8IHAgKyAweDEwMDAwOyBxICs9IDE2KSB7CiAJCQlyYyA9IGRtaV9wcmVzZW50KHEpOwogCQkJaWYgKCFyYykgewogCQkJCWRtaV9hdmFpbGFibGUgPSAxOwogCQkJCWRtaV9pb3VubWFwKHAsIDB4MTAwMDApOwotCQkJCXJldHVybjsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfQogCQlkbWlfaW91bm1hcChwLCAweDEwMDAwKTsKIAl9Ci0gb3V0OglwcmludGsoS0VSTl9JTkZPICJETUkgbm90IHByZXNlbnQgb3IgaW52YWxpZC5cbiIpOworIGVycm9yOgorCXByaW50ayhLRVJOX0lORk8gIkRNSSBub3QgcHJlc2VudCBvciBpbnZhbGlkLlxuIik7Cisgb3V0OgorCWRtaV9pbml0aWFsaXplZCA9IDE7CiB9CiAKIC8qKgpAQCAtNDI0LDYgKzQzMiw4IEBACiAJaW50IGksIGNvdW50ID0gMDsKIAljb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCA9IGxpc3Q7CiAKKwlXQVJOKCFkbWlfaW5pdGlhbGl6ZWQsIEtFUk5fRVJSICJkbWkgY2hlY2s6IG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKKwogCXdoaWxlIChkLT5pZGVudCkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkLT5tYXRjaGVzKTsgaSsrKSB7CiAJCQlpbnQgcyA9IGQtPm1hdGNoZXNbaV0uc2xvdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC9LY29uZmlnCmluZGV4IGNhY2Y4OWUuLmRhNjQxMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL0tjb25maWcKKysrIGIvZHJpdmVycy9oaWQvS2NvbmZpZwpAQCAtMTcsNiArMTcsMjUgQEAKIAl0cmlzdGF0ZSAiR2VuZXJpYyBISUQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElOUFVUCiAJZGVmYXVsdCB5CisgICAgICAgIHNlbGVjdCBISURfQTRURUNIIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX0FQUExFIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX0JFTEtJTiBpZiAhRU1CRURERUQKKyAgICAgICAgc2VsZWN0IEhJRF9CUklHSFQgaWYgIUVNQkVEREVECisgICAgICAgIHNlbGVjdCBISURfQ0hFUlJZIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX0NISUNPTlkgaWYgIUVNQkVEREVECisgICAgICAgIHNlbGVjdCBISURfQ1lQUkVTUyBpZiAhRU1CRURERUQKKyAgICAgICAgc2VsZWN0IEhJRF9ERUxMIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX0VaS0VZIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX0dZUkFUSU9OIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX0xPR0lURUNIIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX01JQ1JPU09GVCBpZiAhRU1CRURERUQKKyAgICAgICAgc2VsZWN0IEhJRF9NT05URVJFWSBpZiAhRU1CRURERUQKKyAgICAgICAgc2VsZWN0IEhJRF9QQU5USEVSTE9SRCBpZiAhRU1CRURERUQKKyAgICAgICAgc2VsZWN0IEhJRF9QRVRBTFlOWCBpZiAhRU1CRURERUQKKyAgICAgICAgc2VsZWN0IEhJRF9TQU1TVU5HIGlmICFFTUJFRERFRAorICAgICAgICBzZWxlY3QgSElEX1NPTlkgaWYgIUVNQkVEREVECisgICAgICAgIHNlbGVjdCBISURfU1VOUExVUyBpZiAhRU1CRURERUQKKwogCS0tLWhlbHAtLS0KIAkgIEEgaHVtYW4gaW50ZXJmYWNlIGRldmljZSAoSElEKSBpcyBhIHR5cGUgb2YgY29tcHV0ZXIgZGV2aWNlIHRoYXQKIAkgIGludGVyYWN0cyBkaXJlY3RseSB3aXRoIGFuZCB0YWtlcyBpbnB1dCBmcm9tIGh1bWFucy4gVGhlIHRlcm0gIkhJRCIKQEAgLTY3LDQgKzg2LDIwNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvaGlkL3VzYmhpZC9LY29uZmlnIgogCittZW51ICJTcGVjaWFsIEhJRCBkcml2ZXJzIgorCWRlcGVuZHMgb24gSElECisKK2NvbmZpZyBISURfQ09NUEFUCisJYm9vbCAiTG9hZCBhbGwgSElEIGRyaXZlcnMgb24gaGlkIGNvcmUgbG9hZCIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJQ29tcGF0aWJsZSBvcHRpb24gZm9yIG9sZGVyIHVzZXJzcGFjZS4gSWYgeW91IGhhdmUgc3lzdGVtIHdpdGhvdXQgdWRldgorCXN1cHBvcnQgb2YgbW9kdWxlIGxvYWRpbmcgdGhyb3VnaCBhbGlhc2VzIGFuZCBhbHNvIG9sZAorCW1vZHVsZS1pbml0LXRvb2xzIHdoaWNoIGNhbid0IGhhbmRsZSBoaWQgYnVzLCBjaG9vc2UgWSBoZXJlLiBPdGhlcndpc2UKKwlzYXkgTi4gSWYgeW91IHNheSBOIGFuZCB5b3VyIHVzZXJzcGFjZSBpcyBvbGQgZW5vdWdoLCB0aGUgb25seQorCWZ1bmN0aW9uYWxpdHkgeW91IGxvc2UgaXMgbW9kdWxlcyBhdXRvbG9hZGluZy4KKworCUlmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBISURfQTRURUNICisJdHJpc3RhdGUgIkE0IHRlY2giCisJZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBVU0JfSElECisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIEE0IHRlY2ggWDUgYW5kIFdPUC0zNSAvIFRydXN0IDQ1MEwgbWljZS4KKworY29uZmlnIEhJRF9BUFBMRQorCXRyaXN0YXRlICJBcHBsZSIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIChVU0JfSElEIHx8IEJUX0hJRFApCisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIHNvbWUgQXBwbGUgZGV2aWNlcyB3aGljaCBsZXNzIG9yIG1vcmUgYnJlYWsKKwlISUQgc3BlY2lmaWNhdGlvbi4KKworCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHNwZWNpYWwga2V5cyAoRm4sIE51bWxvY2spIG9uCisJQXBwbGUgaUJvb2tzLCBQb3dlckJvb2tzLCBNYWNCb29rcywgTWFjQm9vayBQcm9zIGFuZCBhbHVtaW51bSBVU0IKKwlrZXlib2FyZHMuCisKKwlJZiB1bnN1cmUsIHNheSBNLgorCitjb25maWcgSElEX0JFTEtJTgorCXRyaXN0YXRlICJCZWxraW4iCisJZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBVU0JfSElECisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIEJlbGtpbiBGbGlwIEtWTSBhbmQgV2lyZWxlc3Mga2V5Ym9hcmQuCisKK2NvbmZpZyBISURfQlJJR0hUCisJdHJpc3RhdGUgIkJyaWdodCIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgQnJpZ2h0IEFCTlQtMiBrZXlib2FyZC4KKworY29uZmlnIEhJRF9DSEVSUlkKKwl0cmlzdGF0ZSAiQ2hlcnJ5IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBDaGVycnkgQ3ltb3Rpb24uCisKK2NvbmZpZyBISURfQ0hJQ09OWQorCXRyaXN0YXRlICJDaGljb255IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBDaGljb255IFRhY3RpY2FsIHBhZC4KKworY29uZmlnIEhJRF9DWVBSRVNTCisJdHJpc3RhdGUgIkN5cHJlc3MiCisJZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBVU0JfSElECisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIEN5cHJlc3MgbW91c2UgYW5kIGJhcmNvZGVzLgorCitjb25maWcgSElEX0RFTEwKKwl0cmlzdGF0ZSAiRGVsbCIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgRGVsbCBXNzY1OC4KKworY29uZmlnIEhJRF9FWktFWQorCXRyaXN0YXRlICJFemtleSIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgRXprZXkgbW91c2UgYW5kIGJhcmNvZGVzLgorCitjb25maWcgSElEX0dZUkFUSU9OCisJdHJpc3RhdGUgIkd5cmF0aW9uIgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBHeXJhdGlvbiByZW1vdGUuCisKK2NvbmZpZyBISURfTE9HSVRFQ0gKKwl0cmlzdGF0ZSAiTG9naXRlY2giCisJZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBVU0JfSElECisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIHNvbWUgTG9naXRlY2ggZGV2aWNlcyB3aGljaCBicmVha3MgbGVzcyBvciBtb3JlCisJSElEIHNwZWNpZmljYXRpb24uCisKK2NvbmZpZyBMT0dJVEVDSF9GRgorCWJvb2wgIkxvZ2l0ZWNoIGZvcmNlIGZlZWRiYWNrIgorCWRlcGVuZHMgb24gSElEX0xPR0lURUNICisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBkZXZpY2VzOgorCSAgLSBMb2dpdGVjaCBXaW5nTWFuIENvcmRsZXNzIFJ1bWJsZVBhZAorCSAgLSBMb2dpdGVjaCBXaW5nTWFuIENvcmRsZXNzIFJ1bWJsZVBhZCAyCisJICAtIExvZ2l0ZWNoIFdpbmdNYW4gRm9yY2UgM0QKKwkgIC0gTG9naXRlY2ggRm9ybXVsYSBGb3JjZSBFWAorCSAgLSBMb2dpdGVjaCBNT01PIEZvcmNlIHdoZWVsCisKKwkgIGFuZCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgZm9yIHRoZW0uCisJICBOb3RlOiBpZiB5b3Ugc2F5IE4gaGVyZSwgdGhpcyBkZXZpY2Ugd2lsbCBzdGlsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB3aXRob3V0CisJICBmb3JjZSBmZWVkYmFjay4KKworY29uZmlnIExPR0lSVU1CTEVQQUQyX0ZGCisJYm9vbCAiTG9naXRlY2ggUnVtYmxlcGFkIDIgZm9yY2UgZmVlZGJhY2siCisJZGVwZW5kcyBvbiBISURfTE9HSVRFQ0gKKwlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIExvZ2l0ZWNoCisJICBSdW1ibGVwYWQgMiBkZXZpY2VzLgorCitjb25maWcgSElEX01JQ1JPU09GVAorCXRyaXN0YXRlICJNaWNyb3NvZnQiCisJZGVmYXVsdCBtCisJZGVwZW5kcyBvbiBVU0JfSElECisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIHNvbWUgTWljcm9zb2Z0IGRldmljZXMgd2hpY2ggYnJlYWtzIGxlc3Mgb3IgbW9yZQorCUhJRCBzcGVjaWZpY2F0aW9uLgorCitjb25maWcgSElEX01PTlRFUkVZCisJdHJpc3RhdGUgIk1vbnRlcmV5IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBNb250ZXJleSBHZW5pdXMgS0IyOUUuCisKK2NvbmZpZyBISURfUEFOVEhFUkxPUkQKKwl0cmlzdGF0ZSAiUGFudGhlcmxvcmQgZGV2aWNlcyBzdXBwb3J0IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBQYW50aGVyTG9yZC9HcmVlbkFzaWEgYmFzZWQgZGV2aWNlIHN1cHBvcnQuCisKKworY29uZmlnIFBBTlRIRVJMT1JEX0ZGCisJYm9vbCAiUGFudGhlcmxvcmQgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhJRF9QQU5USEVSTE9SRAorCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBnYW1lIGNvbnRyb2xsZXIKKwkgIG9yIGFkYXB0ZXIgYW5kIHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGl0LgorCitjb25maWcgSElEX1BFVEFMWU5YCisJdHJpc3RhdGUgIlBldGFseW54IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBQZXRhbHlueCBNYXh0ZXIgcmVtb3RlLgorCitjb25maWcgSElEX1NBTVNVTkcKKwl0cmlzdGF0ZSAiU2Ftc3VuZyIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgU2Ftc3VuZyBJUiByZW1vdGUuCisKK2NvbmZpZyBISURfU09OWQorCXRyaXN0YXRlICJTb255IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBTb255IFBTMyBjb250cm9sbGVyLgorCitjb25maWcgSElEX1NVTlBMVVMKKwl0cmlzdGF0ZSAiU3VucGx1cyIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgU3VucGx1cyBXRGVza3RvcCBpbnB1dCBkZXZpY2UuCisKK2NvbmZpZyBUSFJVU1RNQVNURVJfRkYKKwl0cmlzdGF0ZSAiVGhydXN0TWFzdGVyIGRldmljZXMgc3VwcG9ydCIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBUSFJVU1RNQVNURVIgRmlyZVN0b3JlIER1YWwgUG93ZXIgMiBvcgorCSAgYSBUSFJVU1RNQVNURVIgRmVycmFyaSBHVCBSdW1ibGUgRm9yY2Ugb3IgRm9yY2UgRmVlZGJhY2sgV2hlZWwuCisKK2NvbmZpZyBaRVJPUExVU19GRgorCXRyaXN0YXRlICJaZXJvcGx1cyBiYXNlZCBnYW1lIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBaZXJvcGx1cyBiYXNlZCBnYW1lIGNvbnRyb2xsZXIuCisKK2VuZG1lbnUKKwogZW5kaWYgIyBISURfU1VQUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvTWFrZWZpbGUgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQppbmRleCAyNzVkYzUyLi5iMDllNDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQpAQCAtMSwxMyArMSw0NiBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIEhJRCBkcml2ZXIKICMKLWhpZC1vYmpzCQkJOj0gaGlkLWNvcmUubyBoaWQtaW5wdXQubyBoaWQtaW5wdXQtcXVpcmtzLm8KK2hpZC1vYmpzCQkJOj0gaGlkLWNvcmUubyBoaWQtaW5wdXQubwogCiBvYmotJChDT05GSUdfSElEKQkJKz0gaGlkLm8KIAogaGlkLSQoQ09ORklHX0hJRF9ERUJVRykJCSs9IGhpZC1kZWJ1Zy5vCiBoaWQtJChDT05GSUdfSElEUkFXKQkJKz0gaGlkcmF3Lm8KIAoraWZkZWYgQ09ORklHX0hJRF9DT01QQVQKK29iai1tCQkJCSs9IGhpZC1kdW1teS5vCitlbmRpZgorCitoaWQtbG9naXRlY2gtb2JqcwkJOj0gaGlkLWxnLm8KK2lmZGVmIENPTkZJR19MT0dJVEVDSF9GRgorCWhpZC1sb2dpdGVjaC1vYmpzCSs9IGhpZC1sZ2ZmLm8KK2VuZGlmCitpZmRlZiBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYKKwloaWQtbG9naXRlY2gtb2JqcwkrPSBoaWQtbGcyZmYubworZW5kaWYKKworb2JqLSQoQ09ORklHX0hJRF9BNFRFQ0gpCSs9IGhpZC1hNHRlY2gubworb2JqLSQoQ09ORklHX0hJRF9BUFBMRSkJCSs9IGhpZC1hcHBsZS5vCitvYmotJChDT05GSUdfSElEX0JFTEtJTikJKz0gaGlkLWJlbGtpbi5vCitvYmotJChDT05GSUdfSElEX0JSSUdIVCkJKz0gaGlkLWJyaWdodC5vCitvYmotJChDT05GSUdfSElEX0NIRVJSWSkJKz0gaGlkLWNoZXJyeS5vCitvYmotJChDT05GSUdfSElEX0NISUNPTlkpCSs9IGhpZC1jaGljb255Lm8KK29iai0kKENPTkZJR19ISURfQ1lQUkVTUykJKz0gaGlkLWN5cHJlc3Mubworb2JqLSQoQ09ORklHX0hJRF9ERUxMKQkJKz0gaGlkLWRlbGwubworb2JqLSQoQ09ORklHX0hJRF9FWktFWSkJCSs9IGhpZC1lemtleS5vCitvYmotJChDT05GSUdfSElEX0dZUkFUSU9OKQkrPSBoaWQtZ3lyYXRpb24ubworb2JqLSQoQ09ORklHX0hJRF9MT0dJVEVDSCkJKz0gaGlkLWxvZ2l0ZWNoLm8KK29iai0kKENPTkZJR19ISURfTUlDUk9TT0ZUKQkrPSBoaWQtbWljcm9zb2Z0Lm8KK29iai0kKENPTkZJR19ISURfTU9OVEVSRVkpCSs9IGhpZC1tb250ZXJleS5vCitvYmotJChDT05GSUdfSElEX1BBTlRIRVJMT1JEKQkrPSBoaWQtcGwubworb2JqLSQoQ09ORklHX0hJRF9QRVRBTFlOWCkJKz0gaGlkLXBldGFseW54Lm8KK29iai0kKENPTkZJR19ISURfU0FNU1VORykJKz0gaGlkLXNhbXN1bmcubworb2JqLSQoQ09ORklHX0hJRF9TT05ZKQkJKz0gaGlkLXNvbnkubworb2JqLSQoQ09ORklHX0hJRF9TVU5QTFVTKQkrPSBoaWQtc3VucGx1cy5vCitvYmotJChDT05GSUdfVEhSVVNUTUFTVEVSX0ZGKQkrPSBoaWQtdG1mZi5vCitvYmotJChDT05GSUdfWkVST1BMVVNfRkYpCSs9IGhpZC16cGZmLm8KKwogb2JqLSQoQ09ORklHX1VTQl9ISUQpCQkrPSB1c2JoaWQvCiBvYmotJChDT05GSUdfVVNCX01PVVNFKQkJKz0gdXNiaGlkLwogb2JqLSQoQ09ORklHX1VTQl9LQkQpCQkrPSB1c2JoaWQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYTR0ZWNoLmMgYi9kcml2ZXJzL2hpZC9oaWQtYTR0ZWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjYTAwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1hNHRlY2guYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGE0dGVjaCAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjZGVmaW5lIEE0XzJXSEVFTF9NT1VTRV9IQUNLXzcJMHgwMQorI2RlZmluZSBBNF8yV0hFRUxfTU9VU0VfSEFDS19COAkweDAyCisKK3N0cnVjdCBhNHRlY2hfc2MgeworCXVuc2lnbmVkIGxvbmcgcXVpcmtzOworCXVuc2lnbmVkIGludCBod193aGVlbDsKKwlfX3MzMiBkZWxheWVkX3ZhbHVlOworfTsKKworc3RhdGljIGludCBhNF9pbnB1dF9tYXBwZWQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCXN0cnVjdCBhNHRlY2hfc2MgKmE0ID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKHVzYWdlLT50eXBlID09IEVWX1JFTCAmJiB1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwpCisJCXNldF9iaXQoUkVMX0hXSEVFTCwgKmJpdCk7CisKKwlpZiAoKGE0LT5xdWlya3MgJiBBNF8yV0hFRUxfTU9VU0VfSEFDS183KSAmJiB1c2FnZS0+aGlkID09IDB4MDAwOTAwMDcpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGE0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXN0cnVjdCBhNHRlY2hfc2MgKmE0ID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCisJaWYgKCEoaGRldi0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKSB8fCAhZmllbGQtPmhpZGlucHV0IHx8CisJCQkhdXNhZ2UtPnR5cGUpCisJCXJldHVybiAwOworCisJaW5wdXQgPSBmaWVsZC0+aGlkaW5wdXQtPmlucHV0OworCisJaWYgKGE0LT5xdWlya3MgJiBBNF8yV0hFRUxfTU9VU0VfSEFDS19COCkgeworCQlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfUkVMICYmIHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkgeworCQkJYTQtPmRlbGF5ZWRfdmFsdWUgPSB2YWx1ZTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKHVzYWdlLT5oaWQgPT0gMHgwMDAxMDBiOCkgeworCQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX1JFTCwgdmFsdWUgPyBSRUxfSFdIRUVMIDoKKwkJCQkJUkVMX1dIRUVMLCBhNC0+ZGVsYXllZF92YWx1ZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmICgoYTQtPnF1aXJrcyAmIEE0XzJXSEVFTF9NT1VTRV9IQUNLXzcpICYmIHVzYWdlLT5oaWQgPT0gMHgwMDA5MDAwNykgeworCQlhNC0+aHdfd2hlZWwgPSAhIXZhbHVlOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAodXNhZ2UtPmNvZGUgPT0gUkVMX1dIRUVMICYmIGE0LT5od193aGVlbCkgeworCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIFJFTF9IV0hFRUwsIHZhbHVlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYTRfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYTR0ZWNoX3NjICphNDsKKwlpbnQgcmV0OworCisJYTQgPSBremFsbG9jKHNpemVvZigqYTQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYTQgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJYTQtPnF1aXJrcyA9IGlkLT5kcml2ZXJfZGF0YTsKKworCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBhNCk7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlrZnJlZShhNCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYTRfcmVtb3ZlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCBhNHRlY2hfc2MgKmE0ID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaGlkX2h3X3N0b3AoaGRldik7CisJa2ZyZWUoYTQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgYTRfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BNFRFQ0gsIFVTQl9ERVZJQ0VfSURfQTRURUNIX1dDUDMyUFUpLAorCQkuZHJpdmVyX2RhdGEgPSBBNF8yV0hFRUxfTU9VU0VfSEFDS183IH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0E0VEVDSCwgVVNCX0RFVklDRV9JRF9BNFRFQ0hfWDVfMDA1RCksCisJCS5kcml2ZXJfZGF0YSA9IEE0XzJXSEVFTF9NT1VTRV9IQUNLX0I4IH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGE0X2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgYTRfZHJpdmVyID0geworCS5uYW1lID0gImE0dGVjaCIsCisJLmlkX3RhYmxlID0gYTRfZGV2aWNlcywKKwkuaW5wdXRfbWFwcGVkID0gYTRfaW5wdXRfbWFwcGVkLAorCS5ldmVudCA9IGE0X2V2ZW50LAorCS5wcm9iZSA9IGE0X3Byb2JlLAorCS5yZW1vdmUgPSBhNF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IGE0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmYTRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYTRfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmYTRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYTRfaW5pdCk7Cittb2R1bGVfZXhpdChhNF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihhNHRlY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMgYi9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdmODk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiAgVVNCIEhJRCBxdWlya3Mgc3VwcG9ydCBmb3IgTGludXgKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjZGVmaW5lIEFQUExFX1JERVNDX0pJUwkJMHgwMDAxCisjZGVmaW5lIEFQUExFX0lHTk9SRV9NT1VTRQkweDAwMDIKKyNkZWZpbmUgQVBQTEVfSEFTX0ZOCQkweDAwMDQKKyNkZWZpbmUgQVBQTEVfSElEREVWCQkweDAwMDgKKyNkZWZpbmUgQVBQTEVfSVNPX0tFWUJPQVJECTB4MDAxMAorI2RlZmluZSBBUFBMRV9NSUdIVFlNT1VTRQkweDAwMjAKKyNkZWZpbmUgQVBQTEVfSU5WRVJUX0hXSEVFTAkweDAwNDAKKyNkZWZpbmUgQVBQTEVfSUdOT1JFX0hJRElOUFVUCTB4MDA4MAorI2RlZmluZSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTgkweDAxMDAKKworI2RlZmluZSBBUFBMRV9GTEFHX0ZLRVkJCTB4MDEKKworc3RhdGljIHVuc2lnbmVkIGludCBmbm1vZGUgPSAxOworbW9kdWxlX3BhcmFtKGZubW9kZSwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZubW9kZSwgIk1vZGUgb2YgZm4ga2V5IG9uIEFwcGxlIGtleWJvYXJkcyAoMCA9IGRpc2FibGVkLCAiCisJCSJbMV0gPSBma2V5c2xhc3QsIDIgPSBma2V5c2ZpcnN0KSIpOworCitzdHJ1Y3QgYXBwbGVfc2MgeworCXVuc2lnbmVkIGxvbmcgcXVpcmtzOworCXVuc2lnbmVkIGludCBmbl9vbjsKKwlERUNMQVJFX0JJVE1BUChwcmVzc2VkX2ZuLCBLRVlfQ05UKTsKKwlERUNMQVJFX0JJVE1BUChwcmVzc2VkX251bWxvY2ssIEtFWV9DTlQpOworfTsKKworc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiB7CisJdTE2IGZyb207CisJdTE2IHRvOworCXU4IGZsYWdzOworfTsKKworc3RhdGljIHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gYXBwbGVfZm5fa2V5c1tdID0geworCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0RFTEVURSB9LAorCXsgS0VZX0YxLAlLRVlfQlJJR0hUTkVTU0RPV04sIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YyLAlLRVlfQlJJR0hUTkVTU1VQLCAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YzLAlLRVlfRk5fRjUsICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LCAvKiBFeHBvc8OpICovCisJeyBLRVlfRjQsCUtFWV9GTl9GNCwgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sIC8qIERhc2hib2FyZCAqLworCXsgS0VZX0Y1LAlLRVlfS0JESUxMVU1ET1dOLCAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y2LAlLRVlfS0JESUxMVU1VUCwgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y3LAlLRVlfUFJFVklPVVNTT05HLCAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y4LAlLRVlfUExBWVBBVVNFLCAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y5LAlLRVlfTkVYVFNPTkcsICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YxMCwJS0VZX01VVEUsICAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTEsCUtFWV9WT0xVTUVET1dOLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjEyLAlLRVlfVk9MVU1FVVAsICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX1VQLAlLRVlfUEFHRVVQIH0sCisJeyBLRVlfRE9XTiwJS0VZX1BBR0VET1dOIH0sCisJeyBLRVlfTEVGVCwJS0VZX0hPTUUgfSwKKwl7IEtFWV9SSUdIVCwJS0VZX0VORCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gcG93ZXJib29rX2ZuX2tleXNbXSA9IHsKKwl7IEtFWV9CQUNLU1BBQ0UsIEtFWV9ERUxFVEUgfSwKKwl7IEtFWV9GMSwJS0VZX0JSSUdIVE5FU1NET1dOLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjIsCUtFWV9CUklHSFRORVNTVVAsICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YzLAlLRVlfTVVURSwgICAgICAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNCwJS0VZX1ZPTFVNRURPV04sICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjUsCUtFWV9WT0xVTUVVUCwgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y2LAlLRVlfTlVNTE9DSywgICAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNywJS0VZX1NXSVRDSFZJREVPTU9ERSwgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjgsCUtFWV9LQkRJTExVTVRPR0dMRSwgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y5LAlLRVlfS0JESUxMVU1ET1dOLCAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTAsCUtFWV9LQkRJTExVTVVQLCAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX1VQLAlLRVlfUEFHRVVQIH0sCisJeyBLRVlfRE9XTiwJS0VZX1BBR0VET1dOIH0sCisJeyBLRVlfTEVGVCwJS0VZX0hPTUUgfSwKKwl7IEtFWV9SSUdIVCwJS0VZX0VORCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gcG93ZXJib29rX251bWxvY2tfa2V5c1tdID0geworCXsgS0VZX0osCUtFWV9LUDEgfSwKKwl7IEtFWV9LLAlLRVlfS1AyIH0sCisJeyBLRVlfTCwJS0VZX0tQMyB9LAorCXsgS0VZX1UsCUtFWV9LUDQgfSwKKwl7IEtFWV9JLAlLRVlfS1A1IH0sCisJeyBLRVlfTywJS0VZX0tQNiB9LAorCXsgS0VZXzcsCUtFWV9LUDcgfSwKKwl7IEtFWV84LAlLRVlfS1A4IH0sCisJeyBLRVlfOSwJS0VZX0tQOSB9LAorCXsgS0VZX00sCUtFWV9LUDAgfSwKKwl7IEtFWV9ET1QsCUtFWV9LUERPVCB9LAorCXsgS0VZX1NMQVNILAlLRVlfS1BQTFVTIH0sCisJeyBLRVlfU0VNSUNPTE9OLCBLRVlfS1BNSU5VUyB9LAorCXsgS0VZX1AsCUtFWV9LUEFTVEVSSVNLIH0sCisJeyBLRVlfTUlOVVMsCUtFWV9LUEVRVUFMIH0sCisJeyBLRVlfMCwJS0VZX0tQU0xBU0ggfSwKKwl7IEtFWV9GNiwJS0VZX05VTUxPQ0sgfSwKKwl7IEtFWV9LUEVOVEVSLAlLRVlfS1BFTlRFUiB9LAorCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0JBQ0tTUEFDRSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gYXBwbGVfaXNvX2tleWJvYXJkW10gPSB7CisJeyBLRVlfR1JBVkUsCUtFWV8xMDJORCB9LAorCXsgS0VZXzEwMk5ELAlLRVlfR1JBVkUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uICphcHBsZV9maW5kX3RyYW5zbGF0aW9uKAorCQlzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uICp0YWJsZSwgdTE2IGZyb20pCit7CisJc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiAqdHJhbnM7CisKKwkvKiBMb29rIGZvciB0aGUgdHJhbnNsYXRpb24gKi8KKwlmb3IgKHRyYW5zID0gdGFibGU7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlpZiAodHJhbnMtPmZyb20gPT0gZnJvbSkKKwkJCXJldHVybiB0cmFuczsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGhpZGlucHV0X2FwcGxlX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJc3RydWN0IGFwcGxlX3NjICphc2MgPSBoaWRfZ2V0X2RydmRhdGEoaGlkKTsKKwlzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCWlmICh1c2FnZS0+Y29kZSA9PSBLRVlfRk4pIHsKKwkJYXNjLT5mbl9vbiA9ICEhdmFsdWU7CisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIHZhbHVlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGZubW9kZSkgeworCQlpbnQgZG9fdHJhbnNsYXRlOworCisJCXRyYW5zID0gYXBwbGVfZmluZF90cmFuc2xhdGlvbigoaGlkLT5wcm9kdWN0IDwgMHgyMjAgfHwKKwkJCQkJaGlkLT5wcm9kdWN0ID49IDB4MzAwKSA/CisJCQkJCXBvd2VyYm9va19mbl9rZXlzIDogYXBwbGVfZm5fa2V5cywKKwkJCQkJdXNhZ2UtPmNvZGUpOworCQlpZiAodHJhbnMpIHsKKwkJCWlmICh0ZXN0X2JpdCh1c2FnZS0+Y29kZSwgYXNjLT5wcmVzc2VkX2ZuKSkKKwkJCQlkb190cmFuc2xhdGUgPSAxOworCQkJZWxzZSBpZiAodHJhbnMtPmZsYWdzICYgQVBQTEVfRkxBR19GS0VZKQorCQkJCWRvX3RyYW5zbGF0ZSA9IChmbm1vZGUgPT0gMiAmJiBhc2MtPmZuX29uKSB8fAorCQkJCQkoZm5tb2RlID09IDEgJiYgIWFzYy0+Zm5fb24pOworCQkJZWxzZQorCQkJCWRvX3RyYW5zbGF0ZSA9IGFzYy0+Zm5fb247CisKKwkJCWlmIChkb190cmFuc2xhdGUpIHsKKwkJCQlpZiAodmFsdWUpCisJCQkJCXNldF9iaXQodXNhZ2UtPmNvZGUsIGFzYy0+cHJlc3NlZF9mbik7CisJCQkJZWxzZQorCQkJCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsIGFzYy0+cHJlc3NlZF9mbik7CisKKwkJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHRyYW5zLT50bywKKwkJCQkJCXZhbHVlKTsKKworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisKKwkJaWYgKGFzYy0+cXVpcmtzICYgQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gJiYKKwkJCQkodGVzdF9iaXQodXNhZ2UtPmNvZGUsIGFzYy0+cHJlc3NlZF9udW1sb2NrKSB8fAorCQkJCXRlc3RfYml0KExFRF9OVU1MLCBpbnB1dC0+bGVkKSkpIHsKKwkJCXRyYW5zID0gYXBwbGVfZmluZF90cmFuc2xhdGlvbihwb3dlcmJvb2tfbnVtbG9ja19rZXlzLAorCQkJCQl1c2FnZS0+Y29kZSk7CisKKwkJCWlmICh0cmFucykgeworCQkJCWlmICh2YWx1ZSkKKwkJCQkJc2V0X2JpdCh1c2FnZS0+Y29kZSwKKwkJCQkJCQlhc2MtPnByZXNzZWRfbnVtbG9jayk7CisJCQkJZWxzZQorCQkJCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsCisJCQkJCQkJYXNjLT5wcmVzc2VkX251bWxvY2spOworCisJCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sCisJCQkJCQl2YWx1ZSk7CisJCQl9CisKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGFzYy0+cXVpcmtzICYgQVBQTEVfSVNPX0tFWUJPQVJEKSB7CisJCXRyYW5zID0gYXBwbGVfZmluZF90cmFuc2xhdGlvbihhcHBsZV9pc29fa2V5Ym9hcmQsIHVzYWdlLT5jb2RlKTsKKwkJaWYgKHRyYW5zKSB7CisJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHRyYW5zLT50bywgdmFsdWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBsZV9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXBwbGVfc2MgKmFzYyA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICghKGhkZXYtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkgfHwgIWZpZWxkLT5oaWRpbnB1dCB8fAorCQkJIXVzYWdlLT50eXBlKQorCQlyZXR1cm4gMDsKKworCWlmICgoYXNjLT5xdWlya3MgJiBBUFBMRV9JTlZFUlRfSFdIRUVMKSAmJgorCQkJdXNhZ2UtPmNvZGUgPT0gUkVMX0hXSEVFTCkgeworCQlpbnB1dF9ldmVudChmaWVsZC0+aGlkaW5wdXQtPmlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsCisJCQkJLXZhbHVlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKChhc2MtPnF1aXJrcyAmIEFQUExFX0hBU19GTikgJiYKKwkJCWhpZGlucHV0X2FwcGxlX2V2ZW50KGhkZXYsIGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQsCisJCQkJdXNhZ2UsIHZhbHVlKSkKKwkJcmV0dXJuIDE7CisKKworCXJldHVybiAwOworfQorCisvKgorICogTWFjQm9vayBKSVMga2V5Ym9hcmQgaGFzIHdyb25nIGxvZ2ljYWwgbWF4aW11bQorICovCitzdGF0aWMgdm9pZCBhcHBsZV9yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAorCQl1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJc3RydWN0IGFwcGxlX3NjICphc2MgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoKGFzYy0+cXVpcmtzICYgQVBQTEVfUkRFU0NfSklTKSAmJiByc2l6ZSA+PSA2MCAmJgorCQkJcmRlc2NbNTNdID09IDB4NjUgJiYgcmRlc2NbNTldID09IDB4NjUpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBNYWNCb29rIEpJUyBrZXlib2FyZCByZXBvcnQgIgorCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJcmRlc2NbNTNdID0gcmRlc2NbNTldID0gMHhlNzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFwcGxlX3NldHVwX2lucHV0KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQoreworCXN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOworCisJc2V0X2JpdChLRVlfTlVNTE9DSywgaW5wdXQtPmtleWJpdCk7CisKKwkvKiBFbmFibGUgYWxsIG5lZWRlZCBrZXlzICovCisJZm9yICh0cmFucyA9IGFwcGxlX2ZuX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7CisKKwlmb3IgKHRyYW5zID0gcG93ZXJib29rX2ZuX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7CisKKwlmb3IgKHRyYW5zID0gcG93ZXJib29rX251bWxvY2tfa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKKworCWZvciAodHJhbnMgPSBhcHBsZV9pc29fa2V5Ym9hcmQ7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKHVzYWdlLT5oaWQgPT0gKEhJRF9VUF9DVVNUT00gfCAweDAwMDMpKSB7CisJCS8qIFRoZSBmbiBrZXkgb24gQXBwbGUgVVNCIGtleWJvYXJkcyAqLworCQlzZXRfYml0KEVWX1JFUCwgaGktPmlucHV0LT5ldmJpdCk7CisJCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgRVZfS0VZLCBLRVlfRk4pOworCQlhcHBsZV9zZXR1cF9pbnB1dChoaS0+aW5wdXQpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiB3ZSB3YW50IHRoZSBoaWQgbGF5ZXIgdG8gZ28gdGhyb3VnaCBzdGFuZGFyZCBwYXRoIChzZXQgYW5kIGlnbm9yZSkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBsZV9pbnB1dF9tYXBwZWQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCXN0cnVjdCBhcHBsZV9zYyAqYXNjID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKGFzYy0+cXVpcmtzICYgQVBQTEVfTUlHSFRZTU9VU0UpIHsKKwkJaWYgKHVzYWdlLT5oaWQgPT0gSElEX0dEX1opCisJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsIEVWX1JFTCwgUkVMX0hXSEVFTCk7CisJCWVsc2UgaWYgKHVzYWdlLT5jb2RlID09IEJUTl8xKQorCQkJaGlkX21hcF91c2FnZShoaSwgdXNhZ2UsIGJpdCwgbWF4LCBFVl9LRVksIEJUTl8yKTsKKwkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzIpCisJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsIEVWX0tFWSwgQlROXzEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGxlX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAorCQljb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSBpZC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGFwcGxlX3NjICphc2M7CisJdW5zaWduZWQgaW50IGNvbm5lY3RfbWFzayA9IEhJRF9DT05ORUNUX0RFRkFVTFQ7CisJaW50IHJldDsKKworCS8qIHJldHVybiBzb21ldGhpbmcgZWxzZSBvciBtb3ZlIHRvIGhpZCBsYXllcj8gZGV2aWNlIHdpbGwgcmVzaWRlCisJICAgYWxsb2NhdGVkICovCisJaWYgKGlkLT5idXMgPT0gQlVTX1VTQiAmJiAocXVpcmtzICYgQVBQTEVfSUdOT1JFX01PVVNFKSAmJgorCQkJdG9fdXNiX2ludGVyZmFjZShoZGV2LT5kZXYucGFyZW50KS0+Y3VyX2FsdHNldHRpbmctPgorCQkJZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9NT1VTRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhc2MgPSBremFsbG9jKHNpemVvZigqYXNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFzYyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIGFwcGxlIGRlc2NyaXB0b3JcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhc2MtPnF1aXJrcyA9IHF1aXJrczsKKworCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBhc2MpOworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlpZiAocXVpcmtzICYgQVBQTEVfSElEREVWKQorCQljb25uZWN0X21hc2sgfD0gSElEX0NPTk5FQ1RfSElEREVWX0ZPUkNFOworCWlmIChxdWlya3MgJiBBUFBMRV9JR05PUkVfSElESU5QVVQpCisJCWNvbm5lY3RfbWFzayAmPSB+SElEX0NPTk5FQ1RfSElESU5QVVQ7CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgY29ubmVjdF9tYXNrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlrZnJlZShhc2MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGxlX3JlbW92ZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwloaWRfaHdfc3RvcChoZGV2KTsKKwlrZnJlZShoaWRfZ2V0X2RydmRhdGEoaGRldikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgYXBwbGVfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BVFZfSVJDT05UUk9MKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSElEREVWIHwgQVBQTEVfSUdOT1JFX0hJRElOUFVUIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0lSQ09OVFJPTDQpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9ISURERVYgfCBBUFBMRV9JR05PUkVfSElESU5QVVQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfTUlHSFRZTU9VU0UpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9NSUdIVFlNT1VTRSB8IEFQUExFX0lOVkVSVF9IV0hFRUwgfSwKKworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0lTTyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIHwgQVBQTEVfSVNPX0tFWUJPQVJEIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIHwgQVBQTEVfSVNPX0tFWUJPQVJEIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIHwgQVBQTEVfUkRFU0NfSklTIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0lTTyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB8IEFQUExFX0lTT19LRVlCT0FSRCB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB8IEFQUExFX1JERVNDX0pJU30sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfCBBUFBMRV9SREVTQ19KSVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSVNPX0tFWUJPQVJEIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklOR19JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSklTKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfSUdOT1JFX01PVVNFIHwgQVBQTEVfUkRFU0NfSklTIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfSVNPX0tFWUJPQVJEIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JR05PUkVfTU9VU0UgfCBBUFBMRV9SREVTQ19KSVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIxX1RQX09OTFkpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfSwKKworCS8qIEFwcGxlIHdpcmVsZXNzIE1pZ2h0eSBNb3VzZSAqLworCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBjKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTUlHSFRZTU9VU0UgfCBBUFBMRV9JTlZFUlRfSFdIRUVMIH0sCisKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgYXBwbGVfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBhcHBsZV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiYXBwbGUiLAorCS5pZF90YWJsZSA9IGFwcGxlX2RldmljZXMsCisJLnJlcG9ydF9maXh1cCA9IGFwcGxlX3JlcG9ydF9maXh1cCwKKwkucHJvYmUgPSBhcHBsZV9wcm9iZSwKKwkucmVtb3ZlID0gYXBwbGVfcmVtb3ZlLAorCS5ldmVudCA9IGFwcGxlX2V2ZW50LAorCS5pbnB1dF9tYXBwaW5nID0gYXBwbGVfaW5wdXRfbWFwcGluZywKKwkuaW5wdXRfbWFwcGVkID0gYXBwbGVfaW5wdXRfbWFwcGVkLAorfTsKKworc3RhdGljIGludCBhcHBsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmFwcGxlX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCByZWdpc3RlciBhcHBsZSBkcml2ZXJcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXBwbGVfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmYXBwbGVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXBwbGVfaW5pdCk7Cittb2R1bGVfZXhpdChhcHBsZV9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihhcHBsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYmVsa2luLmMgYi9kcml2ZXJzL2hpZC9oaWQtYmVsa2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjOGE5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1iZWxraW4uYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGJlbGtpbiAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2RlZmluZSBCRUxLSU5fSElEREVWCTB4MDEKKyNkZWZpbmUgQkVMS0lOX1dLQkQJMHgwMgorCisjZGVmaW5lIGJlbGtpbl9tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgYmVsa2luX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCXVuc2lnbmVkIGxvbmcgcXVpcmtzID0gKHVuc2lnbmVkIGxvbmcpaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUiB8fAorCQkJIShxdWlya3MgJiBCRUxLSU5fV0tCRCkpCisJCXJldHVybiAwOworCisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJY2FzZSAweDAzYTogYmVsa2luX21hcF9rZXlfY2xlYXIoS0VZX1NPVU5EKTsJCWJyZWFrOworCWNhc2UgMHgwM2I6IGJlbGtpbl9tYXBfa2V5X2NsZWFyKEtFWV9DQU1FUkEpOwkJYnJlYWs7CisJY2FzZSAweDAzYzogYmVsa2luX21hcF9rZXlfY2xlYXIoS0VZX0RPQ1VNRU5UUyk7CWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBiZWxraW5fcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9IGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJaGlkX3NldF9kcnZkYXRhKGhkZXYsICh2b2lkICopcXVpcmtzKTsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgfAorCQkoKHF1aXJrcyAmIEJFTEtJTl9ISURERVYpID8gSElEX0NPTk5FQ1RfSElEREVWX0ZPUkNFIDogMCkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBiZWxraW5fZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CRUxLSU4sIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0pLAorCQkuZHJpdmVyX2RhdGEgPSBCRUxLSU5fSElEREVWIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xBQlRFQywgVVNCX0RFVklDRV9JRF9MQUJURUNfV0lSRUxFU1NfS0VZQk9BUkQpLAorCQkuZHJpdmVyX2RhdGEgPSBCRUxLSU5fV0tCRCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBiZWxraW5fZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBiZWxraW5fZHJpdmVyID0geworCS5uYW1lID0gImJlbGtpbiIsCisJLmlkX3RhYmxlID0gYmVsa2luX2RldmljZXMsCisJLmlucHV0X21hcHBpbmcgPSBiZWxraW5faW5wdXRfbWFwcGluZywKKwkucHJvYmUgPSBiZWxraW5fcHJvYmUsCit9OworCitzdGF0aWMgaW50IGJlbGtpbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmJlbGtpbl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBiZWxraW5fZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmYmVsa2luX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGJlbGtpbl9pbml0KTsKK21vZHVsZV9leGl0KGJlbGtpbl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihiZWxraW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWJyaWdodC5jIGIvZHJpdmVycy9oaWQvaGlkLWJyaWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTE3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtYnJpZ2h0LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGJyaWdodCAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+CisgKgorICogQmFzZWQgb24gaGlkLWRlbGwgZHJpdmVyCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCitzdGF0aWMgaW50IGJyaWdodF9wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJdXNiaGlkX3NldF9sZWRzKGhkZXYpOworCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgYnJpZ2h0X2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQlJJR0hULCBVU0JfREVWSUNFX0lEX0JSSUdIVF9BQk5UMikgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgYnJpZ2h0X2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgYnJpZ2h0X2RyaXZlciA9IHsKKwkubmFtZSA9ICJicmlnaHQiLAorCS5pZF90YWJsZSA9IGJyaWdodF9kZXZpY2VzLAorCS5wcm9iZSA9IGJyaWdodF9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgYnJpZ2h0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmYnJpZ2h0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGJyaWdodF9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZicmlnaHRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYnJpZ2h0X2luaXQpOworbW9kdWxlX2V4aXQoYnJpZ2h0X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGJyaWdodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY2hlcnJ5LmMgYi9kcml2ZXJzL2hpZC9oaWQtY2hlcnJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzM2I5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jaGVycnkuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgY2hlcnJ5ICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisvKgorICogQ2hlcnJ5IEN5bW90aW9uIGtleWJvYXJkIGhhdmUgYW4gaW52YWxpZCBISUQgcmVwb3J0IGRlc2NyaXB0b3IsCisgKiB0aGF0IG5lZWRzIGZpeGluZyBiZWZvcmUgd2UgY2FuIHBhcnNlIGl0LgorICovCitzdGF0aWMgdm9pZCBjaF9yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAorCQl1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJaWYgKHJzaXplID49IDE3ICYmIHJkZXNjWzExXSA9PSAweDNjICYmIHJkZXNjWzEyXSA9PSAweDAyKSB7CisJCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgQ2hlcnJ5IEN5bW90aW9uIHJlcG9ydCAiCisJCQkJImRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1sxMV0gPSByZGVzY1sxNl0gPSAweGZmOworCQlyZGVzY1sxMl0gPSByZGVzY1sxN10gPSAweDAzOworCX0KK30KKworI2RlZmluZSBjaF9tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgY2hfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwljYXNlIDB4MzAxOiBjaF9tYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CWJyZWFrOworCWNhc2UgMHgzMDI6IGNoX21hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJYnJlYWs7CisJY2FzZSAweDMwMzogY2hfbWFwX2tleV9jbGVhcihLRVlfUFJPRzMpOwlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGNoX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTikgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgY2hfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBjaF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY2hlcnJ5IiwKKwkuaWRfdGFibGUgPSBjaF9kZXZpY2VzLAorCS5yZXBvcnRfZml4dXAgPSBjaF9yZXBvcnRfZml4dXAsCisJLmlucHV0X21hcHBpbmcgPSBjaF9pbnB1dF9tYXBwaW5nLAorfTsKKworc3RhdGljIGludCBjaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmNoX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGNoX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmNoX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNoX2luaXQpOworbW9kdWxlX2V4aXQoY2hfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoY2hlcnJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jaGljb255LmMgYi9kcml2ZXJzL2hpZC9oaWQtY2hpY29ueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NGQ0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtY2hpY29ueS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBjaGljb255ICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgY2hfbWFwX2tleV9jbGVhcihjKQloaWRfbWFwX3VzYWdlX2NsZWFyKGhpLCB1c2FnZSwgYml0LCBtYXgsIFwKKwkJCQkJRVZfS0VZLCAoYykpCitzdGF0aWMgaW50IGNoX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTVNWRU5ET1IpCisJCXJldHVybiAwOworCisJc2V0X2JpdChFVl9SRVAsIGhpLT5pbnB1dC0+ZXZiaXQpOworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCWNhc2UgMHhmZjAxOiBjaF9tYXBfa2V5X2NsZWFyKEJUTl8xKTsJYnJlYWs7CisJY2FzZSAweGZmMDI6IGNoX21hcF9rZXlfY2xlYXIoQlROXzIpOwlicmVhazsKKwljYXNlIDB4ZmYwMzogY2hfbWFwX2tleV9jbGVhcihCVE5fMyk7CWJyZWFrOworCWNhc2UgMHhmZjA0OiBjaF9tYXBfa2V5X2NsZWFyKEJUTl80KTsJYnJlYWs7CisJY2FzZSAweGZmMDU6IGNoX21hcF9rZXlfY2xlYXIoQlROXzUpOwlicmVhazsKKwljYXNlIDB4ZmYwNjogY2hfbWFwX2tleV9jbGVhcihCVE5fNik7CWJyZWFrOworCWNhc2UgMHhmZjA3OiBjaF9tYXBfa2V5X2NsZWFyKEJUTl83KTsJYnJlYWs7CisJY2FzZSAweGZmMDg6IGNoX21hcF9rZXlfY2xlYXIoQlROXzgpOwlicmVhazsKKwljYXNlIDB4ZmYwOTogY2hfbWFwX2tleV9jbGVhcihCVE5fOSk7CWJyZWFrOworCWNhc2UgMHhmZjBhOiBjaF9tYXBfa2V5X2NsZWFyKEJUTl9BKTsJYnJlYWs7CisJY2FzZSAweGZmMGI6IGNoX21hcF9rZXlfY2xlYXIoQlROX0IpOwlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBjaF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NISUNPTlksIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9UQUNUSUNBTF9QQUQpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGNoX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgY2hfZHJpdmVyID0geworCS5uYW1lID0gImNoaWNvbnkiLAorCS5pZF90YWJsZSA9IGNoX2RldmljZXMsCisJLmlucHV0X21hcHBpbmcgPSBjaF9pbnB1dF9tYXBwaW5nLAorfTsKKworc3RhdGljIGludCBjaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmNoX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGNoX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmNoX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNoX2luaXQpOworbW9kdWxlX2V4aXQoY2hfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoY2hpY29ueSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwppbmRleCA0MjZhYzVhLi44YTdkOWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9oaWQtZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9oaWRyYXcuaD4KIAorI2luY2x1ZGUgImhpZC1pZHMuaCIKKwogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwpAQCAtMjY4LDkgKzI3MCw5IEBACiBzdGF0aWMgdTMyIGl0ZW1fdWRhdGEoc3RydWN0IGhpZF9pdGVtICppdGVtKQogewogCXN3aXRjaCAoaXRlbS0+c2l6ZSkgewotCQljYXNlIDE6IHJldHVybiBpdGVtLT5kYXRhLnU4OwotCQljYXNlIDI6IHJldHVybiBpdGVtLT5kYXRhLnUxNjsKLQkJY2FzZSA0OiByZXR1cm4gaXRlbS0+ZGF0YS51MzI7CisJY2FzZSAxOiByZXR1cm4gaXRlbS0+ZGF0YS51ODsKKwljYXNlIDI6IHJldHVybiBpdGVtLT5kYXRhLnUxNjsKKwljYXNlIDQ6IHJldHVybiBpdGVtLT5kYXRhLnUzMjsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzgsOSArMjgwLDkgQEAKIHN0YXRpYyBzMzIgaXRlbV9zZGF0YShzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCiB7CiAJc3dpdGNoIChpdGVtLT5zaXplKSB7Ci0JCWNhc2UgMTogcmV0dXJuIGl0ZW0tPmRhdGEuczg7Ci0JCWNhc2UgMjogcmV0dXJuIGl0ZW0tPmRhdGEuczE2OwotCQljYXNlIDQ6IHJldHVybiBpdGVtLT5kYXRhLnMzMjsKKwljYXNlIDE6IHJldHVybiBpdGVtLT5kYXRhLnM4OworCWNhc2UgMjogcmV0dXJuIGl0ZW0tPmRhdGEuczE2OworCWNhc2UgNDogcmV0dXJuIGl0ZW0tPmRhdGEuczMyOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI5Miw4NyArMjk0LDkxIEBACiBzdGF0aWMgaW50IGhpZF9wYXJzZXJfZ2xvYmFsKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKIHsKIAlzd2l0Y2ggKGl0ZW0tPnRhZykgeworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19QVVNIOgogCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19QVVNIOgotCi0JCQlpZiAocGFyc2VyLT5nbG9iYWxfc3RhY2tfcHRyID09IEhJRF9HTE9CQUxfU1RBQ0tfU0laRSkgewotCQkJCWRiZ19oaWQoImdsb2JhbCBlbnZpcm9tZW50IHN0YWNrIG92ZXJmbG93XG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCW1lbWNweShwYXJzZXItPmdsb2JhbF9zdGFjayArIHBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0cisrLAotCQkJCSZwYXJzZXItPmdsb2JhbCwgc2l6ZW9mKHN0cnVjdCBoaWRfZ2xvYmFsKSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUE9QOgotCi0JCQlpZiAoIXBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0cikgewotCQkJCWRiZ19oaWQoImdsb2JhbCBlbnZpcm9tZW50IHN0YWNrIHVuZGVyZmxvd1xuIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQltZW1jcHkoJnBhcnNlci0+Z2xvYmFsLCBwYXJzZXItPmdsb2JhbF9zdGFjayArIC0tcGFyc2VyLT5nbG9iYWxfc3RhY2tfcHRyLAotCQkJCXNpemVvZihzdHJ1Y3QgaGlkX2dsb2JhbCkpOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1VTQUdFX1BBR0U6Ci0JCQlwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlID0gaXRlbV91ZGF0YShpdGVtKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19MT0dJQ0FMX01JTklNVU06Ci0JCQlwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21pbmltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX0xPR0lDQUxfTUFYSU1VTToKLQkJCWlmIChwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21pbmltdW0gPCAwKQotCQkJCXBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWF4aW11bSA9IGl0ZW1fc2RhdGEoaXRlbSk7Ci0JCQllbHNlCi0JCQkJcGFyc2VyLT5nbG9iYWwubG9naWNhbF9tYXhpbXVtID0gaXRlbV91ZGF0YShpdGVtKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19QSFlTSUNBTF9NSU5JTVVNOgotCQkJcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWluaW11bSA9IGl0ZW1fc2RhdGEoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUEhZU0lDQUxfTUFYSU1VTToKLQkJCWlmIChwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9taW5pbXVtIDwgMCkKLQkJCQlwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9tYXhpbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKLQkJCWVsc2UKLQkJCQlwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9tYXhpbXVtID0gaXRlbV91ZGF0YShpdGVtKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19VTklUX0VYUE9ORU5UOgotCQkJcGFyc2VyLT5nbG9iYWwudW5pdF9leHBvbmVudCA9IGl0ZW1fc2RhdGEoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfVU5JVDoKLQkJCXBhcnNlci0+Z2xvYmFsLnVuaXQgPSBpdGVtX3VkYXRhKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1JFUE9SVF9TSVpFOgotCQkJaWYgKChwYXJzZXItPmdsb2JhbC5yZXBvcnRfc2l6ZSA9IGl0ZW1fdWRhdGEoaXRlbSkpID4gMzIpIHsKLQkJCQlkYmdfaGlkKCJpbnZhbGlkIHJlcG9ydF9zaXplICVkXG4iLCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfc2l6ZSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1JFUE9SVF9DT1VOVDoKLQkJCWlmICgocGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50ID0gaXRlbV91ZGF0YShpdGVtKSkgPiBISURfTUFYX1VTQUdFUykgewotCQkJCWRiZ19oaWQoImludmFsaWQgcmVwb3J0X2NvdW50ICVkXG4iLCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfSUQ6Ci0JCQlpZiAoKHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9pZCA9IGl0ZW1fdWRhdGEoaXRlbSkpID09IDApIHsKLQkJCQlkYmdfaGlkKCJyZXBvcnRfaWQgMCBpcyBpbnZhbGlkXG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQotCQlkZWZhdWx0OgotCQkJZGJnX2hpZCgidW5rbm93biBnbG9iYWwgdGFnIDB4JXhcbiIsIGl0ZW0tPnRhZyk7CisJCWlmIChwYXJzZXItPmdsb2JhbF9zdGFja19wdHIgPT0gSElEX0dMT0JBTF9TVEFDS19TSVpFKSB7CisJCQlkYmdfaGlkKCJnbG9iYWwgZW52aXJvbWVudCBzdGFjayBvdmVyZmxvd1xuIik7CiAJCQlyZXR1cm4gLTE7CisJCX0KKworCQltZW1jcHkocGFyc2VyLT5nbG9iYWxfc3RhY2sgKyBwYXJzZXItPmdsb2JhbF9zdGFja19wdHIrKywKKwkJCSZwYXJzZXItPmdsb2JhbCwgc2l6ZW9mKHN0cnVjdCBoaWRfZ2xvYmFsKSk7CisJCXJldHVybiAwOworCisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BPUDoKKworCQlpZiAoIXBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0cikgeworCQkJZGJnX2hpZCgiZ2xvYmFsIGVudmlyb21lbnQgc3RhY2sgdW5kZXJmbG93XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW1lbWNweSgmcGFyc2VyLT5nbG9iYWwsIHBhcnNlci0+Z2xvYmFsX3N0YWNrICsKKwkJCS0tcGFyc2VyLT5nbG9iYWxfc3RhY2tfcHRyLCBzaXplb2Yoc3RydWN0IGhpZF9nbG9iYWwpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfVVNBR0VfUEFHRToKKwkJcGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCXJldHVybiAwOworCisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX0xPR0lDQUxfTUlOSU1VTToKKwkJcGFyc2VyLT5nbG9iYWwubG9naWNhbF9taW5pbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfTE9HSUNBTF9NQVhJTVVNOgorCQlpZiAocGFyc2VyLT5nbG9iYWwubG9naWNhbF9taW5pbXVtIDwgMCkKKwkJCXBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWF4aW11bSA9IGl0ZW1fc2RhdGEoaXRlbSk7CisJCWVsc2UKKwkJCXBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWF4aW11bSA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCXJldHVybiAwOworCisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BIWVNJQ0FMX01JTklNVU06CisJCXBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21pbmltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19QSFlTSUNBTF9NQVhJTVVNOgorCQlpZiAocGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWluaW11bSA8IDApCisJCQlwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9tYXhpbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKKwkJZWxzZQorCQkJcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWF4aW11bSA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCXJldHVybiAwOworCisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1VOSVRfRVhQT05FTlQ6CisJCXBhcnNlci0+Z2xvYmFsLnVuaXRfZXhwb25lbnQgPSBpdGVtX3NkYXRhKGl0ZW0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19VTklUOgorCQlwYXJzZXItPmdsb2JhbC51bml0ID0gaXRlbV91ZGF0YShpdGVtKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX1NJWkU6CisJCXBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplID0gaXRlbV91ZGF0YShpdGVtKTsKKwkJaWYgKHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplID4gMzIpIHsKKwkJCWRiZ19oaWQoImludmFsaWQgcmVwb3J0X3NpemUgJWRcbiIsCisJCQkJCXBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfQ09VTlQ6CisJCXBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCWlmIChwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQgPiBISURfTUFYX1VTQUdFUykgeworCQkJZGJnX2hpZCgiaW52YWxpZCByZXBvcnRfY291bnQgJWRcbiIsCisJCQkJCXBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX0lEOgorCQlwYXJzZXItPmdsb2JhbC5yZXBvcnRfaWQgPSBpdGVtX3VkYXRhKGl0ZW0pOworCQlpZiAocGFyc2VyLT5nbG9iYWwucmVwb3J0X2lkID09IDApIHsKKwkJCWRiZ19oaWQoInJlcG9ydF9pZCAwIGlzIGludmFsaWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJZGJnX2hpZCgidW5rbm93biBnbG9iYWwgdGFnIDB4JXhcbiIsIGl0ZW0tPnRhZyk7CisJCXJldHVybiAtMTsKIAl9CiB9CiAKQEAgLTM5Myw3NyArMzk5LDc2IEBACiAJZGF0YSA9IGl0ZW1fdWRhdGEoaXRlbSk7CiAKIAlzd2l0Y2ggKGl0ZW0tPnRhZykgeworCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX0RFTElNSVRFUjoKIAotCQljYXNlIEhJRF9MT0NBTF9JVEVNX1RBR19ERUxJTUlURVI6Ci0KLQkJCWlmIChkYXRhKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSB0cmVhdCBpdGVtcyBiZWZvcmUgdGhlIGZpcnN0IGRlbGltaXRlcgotCQkJCSAqIGFzIGdsb2JhbCB0byBhbGwgdXNhZ2Ugc2V0cyAoYnJhbmNoIDApLgotCQkJCSAqIEluIHRoZSBtb21lbnQgd2UgcHJvY2VzcyBvbmx5IHRoZXNlIGdsb2JhbAotCQkJCSAqIGl0ZW1zIGFuZCB0aGUgZmlyc3QgZGVsaW1pdGVyIHNldC4KLQkJCQkgKi8KLQkJCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGggIT0gMCkgewotCQkJCQlkYmdfaGlkKCJuZXN0ZWQgZGVsaW1pdGVyc1xuIik7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGgrKzsKLQkJCQlwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9icmFuY2grKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2RlcHRoIDwgMSkgewotCQkJCQlkYmdfaGlkKCJib2d1cyBjbG9zZSBkZWxpbWl0ZXJcbiIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2RlcHRoLS07CisJCWlmIChkYXRhKSB7CisJCQkvKgorCQkJICogV2UgdHJlYXQgaXRlbXMgYmVmb3JlIHRoZSBmaXJzdCBkZWxpbWl0ZXIKKwkJCSAqIGFzIGdsb2JhbCB0byBhbGwgdXNhZ2Ugc2V0cyAoYnJhbmNoIDApLgorCQkJICogSW4gdGhlIG1vbWVudCB3ZSBwcm9jZXNzIG9ubHkgdGhlc2UgZ2xvYmFsCisJCQkgKiBpdGVtcyBhbmQgdGhlIGZpcnN0IGRlbGltaXRlciBzZXQuCisJCQkgKi8KKwkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCAhPSAwKSB7CisJCQkJZGJnX2hpZCgibmVzdGVkIGRlbGltaXRlcnNcbiIpOworCQkJCXJldHVybiAtMTsKIAkJCX0KLQkJCXJldHVybiAxOwotCi0JCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFOgotCi0JCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgewotCQkJCWRiZ19oaWQoImFsdGVybmF0aXZlIHVzYWdlIGlnbm9yZWRcbiIpOwotCQkJCXJldHVybiAwOworCQkJcGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGgrKzsKKwkJCXBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2JyYW5jaCsrOworCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2RlcHRoIDwgMSkgeworCQkJCWRiZ19oaWQoImJvZ3VzIGNsb3NlIGRlbGltaXRlclxuIik7CisJCQkJcmV0dXJuIC0xOwogCQkJfQorCQkJcGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGgtLTsKKwkJfQorCQlyZXR1cm4gMTsKIAotCQkJaWYgKGl0ZW0tPnNpemUgPD0gMikKLQkJCQlkYXRhID0gKHBhcnNlci0+Z2xvYmFsLnVzYWdlX3BhZ2UgPDwgMTYpICsgZGF0YTsKKwljYXNlIEhJRF9MT0NBTF9JVEVNX1RBR19VU0FHRToKIAotCQkJcmV0dXJuIGhpZF9hZGRfdXNhZ2UocGFyc2VyLCBkYXRhKTsKLQotCQljYXNlIEhJRF9MT0NBTF9JVEVNX1RBR19VU0FHRV9NSU5JTVVNOgotCi0JCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgewotCQkJCWRiZ19oaWQoImFsdGVybmF0aXZlIHVzYWdlIGlnbm9yZWRcbiIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQotCQkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOwotCi0JCQlwYXJzZXItPmxvY2FsLnVzYWdlX21pbmltdW0gPSBkYXRhOworCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgeworCQkJZGJnX2hpZCgiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZFxuIik7CiAJCQlyZXR1cm4gMDsKKwkJfQogCi0JCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01BWElNVU06CisJCWlmIChpdGVtLT5zaXplIDw9IDIpCisJCQlkYXRhID0gKHBhcnNlci0+Z2xvYmFsLnVzYWdlX3BhZ2UgPDwgMTYpICsgZGF0YTsKIAotCQkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2JyYW5jaCA+IDEpIHsKLQkJCQlkYmdfaGlkKCJhbHRlcm5hdGl2ZSB1c2FnZSBpZ25vcmVkXG4iKTsKLQkJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGhpZF9hZGRfdXNhZ2UocGFyc2VyLCBkYXRhKTsKKworCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01JTklNVU06CisKKwkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2JyYW5jaCA+IDEpIHsKKwkJCWRiZ19oaWQoImFsdGVybmF0aXZlIHVzYWdlIGlnbm9yZWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQorCQkJZGF0YSA9IChwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlIDw8IDE2KSArIGRhdGE7CisKKwkJcGFyc2VyLT5sb2NhbC51c2FnZV9taW5pbXVtID0gZGF0YTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9MT0NBTF9JVEVNX1RBR19VU0FHRV9NQVhJTVVNOgorCisJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9icmFuY2ggPiAxKSB7CisJCQlkYmdfaGlkKCJhbHRlcm5hdGl2ZSB1c2FnZSBpZ25vcmVkXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGl0ZW0tPnNpemUgPD0gMikKKwkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOworCisJCWZvciAobiA9IHBhcnNlci0+bG9jYWwudXNhZ2VfbWluaW11bTsgbiA8PSBkYXRhOyBuKyspCisJCQlpZiAoaGlkX2FkZF91c2FnZShwYXJzZXIsIG4pKSB7CisJCQkJZGJnX2hpZCgiaGlkX2FkZF91c2FnZSBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtMTsKIAkJCX0KKwkJcmV0dXJuIDA7CiAKLQkJCWlmIChpdGVtLT5zaXplIDw9IDIpCi0JCQkJZGF0YSA9IChwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlIDw8IDE2KSArIGRhdGE7CisJZGVmYXVsdDoKIAotCQkJZm9yIChuID0gcGFyc2VyLT5sb2NhbC51c2FnZV9taW5pbXVtOyBuIDw9IGRhdGE7IG4rKykKLQkJCQlpZiAoaGlkX2FkZF91c2FnZShwYXJzZXIsIG4pKSB7Ci0JCQkJCWRiZ19oaWQoImhpZF9hZGRfdXNhZ2UgZmFpbGVkXG4iKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCXJldHVybiAwOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCWRiZ19oaWQoInVua25vd24gbG9jYWwgaXRlbSB0YWcgMHgleFxuIiwgaXRlbS0+dGFnKTsKLQkJCXJldHVybiAwOworCQlkYmdfaGlkKCJ1bmtub3duIGxvY2FsIGl0ZW0gdGFnIDB4JXhcbiIsIGl0ZW0tPnRhZyk7CisJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQ4MCwyNCArNDg1LDI0IEBACiAJZGF0YSA9IGl0ZW1fdWRhdGEoaXRlbSk7CiAKIAlzd2l0Y2ggKGl0ZW0tPnRhZykgewotCQljYXNlIEhJRF9NQUlOX0lURU1fVEFHX0JFR0lOX0NPTExFQ1RJT046Ci0JCQlyZXQgPSBvcGVuX2NvbGxlY3Rpb24ocGFyc2VyLCBkYXRhICYgMHhmZik7Ci0JCQlicmVhazsKLQkJY2FzZSBISURfTUFJTl9JVEVNX1RBR19FTkRfQ09MTEVDVElPTjoKLQkJCXJldCA9IGNsb3NlX2NvbGxlY3Rpb24ocGFyc2VyKTsKLQkJCWJyZWFrOwotCQljYXNlIEhJRF9NQUlOX0lURU1fVEFHX0lOUFVUOgotCQkJcmV0ID0gaGlkX2FkZF9maWVsZChwYXJzZXIsIEhJRF9JTlBVVF9SRVBPUlQsIGRhdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfT1VUUFVUOgotCQkJcmV0ID0gaGlkX2FkZF9maWVsZChwYXJzZXIsIEhJRF9PVVRQVVRfUkVQT1JULCBkYXRhKTsKLQkJCWJyZWFrOwotCQljYXNlIEhJRF9NQUlOX0lURU1fVEFHX0ZFQVRVUkU6Ci0JCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX0ZFQVRVUkVfUkVQT1JULCBkYXRhKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGJnX2hpZCgidW5rbm93biBtYWluIGl0ZW0gdGFnIDB4JXhcbiIsIGl0ZW0tPnRhZyk7Ci0JCQlyZXQgPSAwOworCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfQkVHSU5fQ09MTEVDVElPTjoKKwkJcmV0ID0gb3Blbl9jb2xsZWN0aW9uKHBhcnNlciwgZGF0YSAmIDB4ZmYpOworCQlicmVhazsKKwljYXNlIEhJRF9NQUlOX0lURU1fVEFHX0VORF9DT0xMRUNUSU9OOgorCQlyZXQgPSBjbG9zZV9jb2xsZWN0aW9uKHBhcnNlcik7CisJCWJyZWFrOworCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfSU5QVVQ6CisJCXJldCA9IGhpZF9hZGRfZmllbGQocGFyc2VyLCBISURfSU5QVVRfUkVQT1JULCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBISURfTUFJTl9JVEVNX1RBR19PVVRQVVQ6CisJCXJldCA9IGhpZF9hZGRfZmllbGQocGFyc2VyLCBISURfT1VUUFVUX1JFUE9SVCwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfRkVBVFVSRToKKwkJcmV0ID0gaGlkX2FkZF9maWVsZChwYXJzZXIsIEhJRF9GRUFUVVJFX1JFUE9SVCwgZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRiZ19oaWQoInVua25vd24gbWFpbiBpdGVtIHRhZyAweCV4XG4iLCBpdGVtLT50YWcpOworCQlyZXQgPSAwOwogCX0KIAogCW1lbXNldCgmcGFyc2VyLT5sb2NhbCwgMCwgc2l6ZW9mKHBhcnNlci0+bG9jYWwpKTsJLyogUmVzZXQgdGhlIGxvY2FsIHBhcnNlciBlbnZpcm9ubWVudCAqLwpAQCAtNTM0LDkgKzUzOSwxMCBAQAogICogRnJlZSBhIGRldmljZSBzdHJ1Y3R1cmUsIGFsbCByZXBvcnRzLCBhbmQgYWxsIGZpZWxkcy4KICAqLwogCi12b2lkIGhpZF9mcmVlX2RldmljZShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlKQorc3RhdGljIHZvaWQgaGlkX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQl1bnNpZ25lZCBpLGo7CisJc3RydWN0IGhpZF9kZXZpY2UgKmRldmljZSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBoaWRfZGV2aWNlLCBkZXYpOworCXVuc2lnbmVkIGksIGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSElEX1JFUE9SVF9UWVBFUzsgaSsrKSB7CiAJCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gKnJlcG9ydF9lbnVtID0gZGV2aWNlLT5yZXBvcnRfZW51bSArIGk7CkBAIC01NTIsNyArNTU4LDYgQEAKIAlrZnJlZShkZXZpY2UtPmNvbGxlY3Rpb24pOwogCWtmcmVlKGRldmljZSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChoaWRfZnJlZV9kZXZpY2UpOwogCiAvKgogICogRmV0Y2ggYSByZXBvcnQgZGVzY3JpcHRpb24gaXRlbSBmcm9tIHRoZSBkYXRhIHN0cmVhbS4gV2Ugc3VwcG9ydCBsb25nCkBAIC01OTMsNDcgKzU5OCw1MiBAQAogCWl0ZW0tPnNpemUgPSBiICYgMzsKIAogCXN3aXRjaCAoaXRlbS0+c2l6ZSkgeworCWNhc2UgMDoKKwkJcmV0dXJuIHN0YXJ0OwogCi0JCWNhc2UgMDoKLQkJCXJldHVybiBzdGFydDsKKwljYXNlIDE6CisJCWlmICgoZW5kIC0gc3RhcnQpIDwgMSkKKwkJCXJldHVybiBOVUxMOworCQlpdGVtLT5kYXRhLnU4ID0gKnN0YXJ0Kys7CisJCXJldHVybiBzdGFydDsKIAotCQljYXNlIDE6Ci0JCQlpZiAoKGVuZCAtIHN0YXJ0KSA8IDEpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpdGVtLT5kYXRhLnU4ID0gKnN0YXJ0Kys7Ci0JCQlyZXR1cm4gc3RhcnQ7CisJY2FzZSAyOgorCQlpZiAoKGVuZCAtIHN0YXJ0KSA8IDIpCisJCQlyZXR1cm4gTlVMTDsKKwkJaXRlbS0+ZGF0YS51MTYgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc3RhcnQpOworCQlzdGFydCA9IChfX3U4ICopKChfX2xlMTYgKilzdGFydCArIDEpOworCQlyZXR1cm4gc3RhcnQ7CiAKLQkJY2FzZSAyOgotCQkJaWYgKChlbmQgLSBzdGFydCkgPCAyKQotCQkJCXJldHVybiBOVUxMOwotCQkJaXRlbS0+ZGF0YS51MTYgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc3RhcnQpOwotCQkJc3RhcnQgPSAoX191OCAqKSgoX19sZTE2ICopc3RhcnQgKyAxKTsKLQkJCXJldHVybiBzdGFydDsKLQotCQljYXNlIDM6Ci0JCQlpdGVtLT5zaXplKys7Ci0JCQlpZiAoKGVuZCAtIHN0YXJ0KSA8IDQpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpdGVtLT5kYXRhLnUzMiA9IGdldF91bmFsaWduZWRfbGUzMihzdGFydCk7Ci0JCQlzdGFydCA9IChfX3U4ICopKChfX2xlMzIgKilzdGFydCArIDEpOwotCQkJcmV0dXJuIHN0YXJ0OworCWNhc2UgMzoKKwkJaXRlbS0+c2l6ZSsrOworCQlpZiAoKGVuZCAtIHN0YXJ0KSA8IDQpCisJCQlyZXR1cm4gTlVMTDsKKwkJaXRlbS0+ZGF0YS51MzIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoc3RhcnQpOworCQlzdGFydCA9IChfX3U4ICopKChfX2xlMzIgKilzdGFydCArIDEpOworCQlyZXR1cm4gc3RhcnQ7CiAJfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCisvKioKKyAqIGhpZF9wYXJzZV9yZXBvcnQgLSBwYXJzZSBkZXZpY2UgcmVwb3J0CisgKgorICogQGRldmljZTogaGlkIGRldmljZQorICogQHN0YXJ0OiByZXBvcnQgc3RhcnQKKyAqIEBzaXplOiByZXBvcnQgc2l6ZQorICoKICAqIFBhcnNlIGEgcmVwb3J0IGRlc2NyaXB0aW9uIGludG8gYSBoaWRfZGV2aWNlIHN0cnVjdHVyZS4gUmVwb3J0cyBhcmUKICAqIGVudW1lcmF0ZWQsIGZpZWxkcyBhcmUgYXR0YWNoZWQgdG8gdGhlc2UgcmVwb3J0cy4KKyAqIDAgcmV0dXJuZWQgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIG5vbnplcm8gZXJyb3IgdmFsdWUuCiAgKi8KLQotc3RydWN0IGhpZF9kZXZpY2UgKmhpZF9wYXJzZV9yZXBvcnQoX191OCAqc3RhcnQsIHVuc2lnbmVkIHNpemUpCitpbnQgaGlkX3BhcnNlX3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlLCBfX3U4ICpzdGFydCwKKwkJdW5zaWduZWQgc2l6ZSkKIHsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXI7CiAJc3RydWN0IGhpZF9pdGVtIGl0ZW07CiAJX191OCAqZW5kOwotCXVuc2lnbmVkIGk7CisJaW50IHJldDsKIAlzdGF0aWMgaW50ICgqZGlzcGF0Y2hfdHlwZVtdKShzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLAogCQkJCSAgICAgIHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkgPSB7CiAJCWhpZF9wYXJzZXJfbWFpbiwKQEAgLTY0Miw3NiArNjUyLDU3IEBACiAJCWhpZF9wYXJzZXJfcmVzZXJ2ZWQKIAl9OwogCi0JaWYgKCEoZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9kZXZpY2UpLCBHRlBfS0VSTkVMKSkpCi0JCXJldHVybiBOVUxMOworCWlmIChkZXZpY2UtPmRyaXZlci0+cmVwb3J0X2ZpeHVwKQorCQlkZXZpY2UtPmRyaXZlci0+cmVwb3J0X2ZpeHVwKGRldmljZSwgc3RhcnQsIHNpemUpOwogCi0JaWYgKCEoZGV2aWNlLT5jb2xsZWN0aW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9jb2xsZWN0aW9uKSAqCi0JCQkJICAgSElEX0RFRkFVTFRfTlVNX0NPTExFQ1RJT05TLCBHRlBfS0VSTkVMKSkpIHsKLQkJa2ZyZWUoZGV2aWNlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRldmljZS0+Y29sbGVjdGlvbl9zaXplID0gSElEX0RFRkFVTFRfTlVNX0NPTExFQ1RJT05TOwotCi0JZm9yIChpID0gMDsgaSA8IEhJRF9SRVBPUlRfVFlQRVM7IGkrKykKLQkJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cmVwb3J0X2VudW1baV0ucmVwb3J0X2xpc3QpOwotCi0JaWYgKCEoZGV2aWNlLT5yZGVzYyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7Ci0JCWtmcmVlKGRldmljZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKwlkZXZpY2UtPnJkZXNjID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2aWNlLT5yZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAltZW1jcHkoZGV2aWNlLT5yZGVzYywgc3RhcnQsIHNpemUpOwogCWRldmljZS0+cnNpemUgPSBzaXplOwogCi0JaWYgKCEocGFyc2VyID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9wYXJzZXIpKSkpIHsKLQkJa2ZyZWUoZGV2aWNlLT5yZGVzYyk7Ci0JCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7Ci0JCWtmcmVlKGRldmljZSk7Ci0JCXJldHVybiBOVUxMOworCXBhcnNlciA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfcGFyc2VyKSk7CisJaWYgKCFwYXJzZXIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CiAJfQorCiAJbWVtc2V0KHBhcnNlciwgMCwgc2l6ZW9mKHN0cnVjdCBoaWRfcGFyc2VyKSk7CiAJcGFyc2VyLT5kZXZpY2UgPSBkZXZpY2U7CiAKIAllbmQgPSBzdGFydCArIHNpemU7CisJcmV0ID0gLUVJTlZBTDsKIAl3aGlsZSAoKHN0YXJ0ID0gZmV0Y2hfaXRlbShzdGFydCwgZW5kLCAmaXRlbSkpICE9IE5VTEwpIHsKIAogCQlpZiAoaXRlbS5mb3JtYXQgIT0gSElEX0lURU1fRk9STUFUX1NIT1JUKSB7CiAJCQlkYmdfaGlkKCJ1bmV4cGVjdGVkIGxvbmcgZ2xvYmFsIGl0ZW1cbiIpOwotCQkJaGlkX2ZyZWVfZGV2aWNlKGRldmljZSk7Ci0JCQl2ZnJlZShwYXJzZXIpOwotCQkJcmV0dXJuIE5VTEw7CisJCQlnb3RvIGVycjsKIAkJfQogCiAJCWlmIChkaXNwYXRjaF90eXBlW2l0ZW0udHlwZV0ocGFyc2VyLCAmaXRlbSkpIHsKIAkJCWRiZ19oaWQoIml0ZW0gJXUgJXUgJXUgJXUgcGFyc2luZyBmYWlsZWRcbiIsCiAJCQkJaXRlbS5mb3JtYXQsICh1bnNpZ25lZClpdGVtLnNpemUsICh1bnNpZ25lZClpdGVtLnR5cGUsICh1bnNpZ25lZClpdGVtLnRhZyk7Ci0JCQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKLQkJCXZmcmVlKHBhcnNlcik7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJCWdvdG8gZXJyOwogCQl9CiAKIAkJaWYgKHN0YXJ0ID09IGVuZCkgewogCQkJaWYgKHBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIpIHsKIAkJCQlkYmdfaGlkKCJ1bmJhbGFuY2VkIGNvbGxlY3Rpb24gYXQgZW5kIG9mIHJlcG9ydCBkZXNjcmlwdGlvblxuIik7Ci0JCQkJaGlkX2ZyZWVfZGV2aWNlKGRldmljZSk7Ci0JCQkJdmZyZWUocGFyc2VyKTsKLQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlnb3RvIGVycjsKIAkJCX0KIAkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCkgewogCQkJCWRiZ19oaWQoInVuYmFsYW5jZWQgZGVsaW1pdGVyIGF0IGVuZCBvZiByZXBvcnQgZGVzY3JpcHRpb25cbiIpOwotCQkJCWhpZF9mcmVlX2RldmljZShkZXZpY2UpOwotCQkJCXZmcmVlKHBhcnNlcik7Ci0JCQkJcmV0dXJuIE5VTEw7CisJCQkJZ290byBlcnI7CiAJCQl9CiAJCQl2ZnJlZShwYXJzZXIpOwotCQkJcmV0dXJuIGRldmljZTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCiAJZGJnX2hpZCgiaXRlbSBmZXRjaGluZyBmYWlsZWQgYXQgb2Zmc2V0ICVkXG4iLCAoaW50KShlbmQgLSBzdGFydCkpOwotCWhpZF9mcmVlX2RldmljZShkZXZpY2UpOworZXJyOgogCXZmcmVlKHBhcnNlcik7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGhpZF9wYXJzZV9yZXBvcnQpOwogCkBAIC03MjQsOSArNzE1LDkgQEAKIHN0YXRpYyBzMzIgc250bzMyKF9fdTMyIHZhbHVlLCB1bnNpZ25lZCBuKQogewogCXN3aXRjaCAobikgewotCQljYXNlIDg6ICByZXR1cm4gKChfX3M4KXZhbHVlKTsKLQkJY2FzZSAxNjogcmV0dXJuICgoX19zMTYpdmFsdWUpOwotCQljYXNlIDMyOiByZXR1cm4gKChfX3MzMil2YWx1ZSk7CisJY2FzZSA4OiAgcmV0dXJuICgoX19zOCl2YWx1ZSk7CisJY2FzZSAxNjogcmV0dXJuICgoX19zMTYpdmFsdWUpOworCWNhc2UgMzI6IHJldHVybiAoKF9fczMyKXZhbHVlKTsKIAl9CiAJcmV0dXJuIHZhbHVlICYgKDEgPDwgKG4gLSAxKSkgPyB2YWx1ZSB8ICgtMSA8PCBuKSA6IHZhbHVlOwogfQpAQCAtODE1LDkgKzgwNiw3MyBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHZvaWQgaGlkX3Byb2Nlc3NfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSwgaW50IGludGVycnVwdCkKKy8qKgorICogaGlkX21hdGNoX3JlcG9ydCAtIGNoZWNrIGlmIGRyaXZlcidzIHJhd19ldmVudCBzaG91bGQgYmUgY2FsbGVkCisgKgorICogQGhpZDogaGlkIGRldmljZQorICogQHJlcG9ydF90eXBlOiB0eXBlIHRvIG1hdGNoIGFnYWluc3QKKyAqCisgKiBjb21wYXJlIGhpZC0+ZHJpdmVyLT5yZXBvcnRfdGFibGUtPnJlcG9ydF90eXBlIHRvIHJlcG9ydC0+dHlwZQorICovCitzdGF0aWMgaW50IGhpZF9tYXRjaF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCkKIHsKKwljb25zdCBzdHJ1Y3QgaGlkX3JlcG9ydF9pZCAqaWQgPSBoaWQtPmRyaXZlci0+cmVwb3J0X3RhYmxlOworCisJaWYgKCFpZCkgLyogTlVMTCBtZWFucyBhbGwgKi8KKwkJcmV0dXJuIDE7CisKKwlmb3IgKDsgaWQtPnJlcG9ydF90eXBlICE9IEhJRF9URVJNSU5BVE9SOyBpZCsrKQorCQlpZiAoaWQtPnJlcG9ydF90eXBlID09IEhJRF9BTllfSUQgfHwKKwkJCQlpZC0+cmVwb3J0X3R5cGUgPT0gcmVwb3J0LT50eXBlKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGlkX21hdGNoX3VzYWdlIC0gY2hlY2sgaWYgZHJpdmVyJ3MgZXZlbnQgc2hvdWxkIGJlIGNhbGxlZAorICoKKyAqIEBoaWQ6IGhpZCBkZXZpY2UKKyAqIEB1c2FnZTogdXNhZ2UgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIGNvbXBhcmUgaGlkLT5kcml2ZXItPnVzYWdlX3RhYmxlLT51c2FnZV97dHlwZSxjb2RlfSB0bworICogdXNhZ2UtPnVzYWdlX3t0eXBlLGNvZGV9CisgKi8KK3N0YXRpYyBpbnQgaGlkX21hdGNoX3VzYWdlKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlKQoreworCWNvbnN0IHN0cnVjdCBoaWRfdXNhZ2VfaWQgKmlkID0gaGlkLT5kcml2ZXItPnVzYWdlX3RhYmxlOworCisJaWYgKCFpZCkgLyogTlVMTCBtZWFucyBhbGwgKi8KKwkJcmV0dXJuIDE7CisKKwlmb3IgKDsgaWQtPnVzYWdlX3R5cGUgIT0gSElEX0FOWV9JRCAtIDE7IGlkKyspCisJCWlmICgoaWQtPnVzYWdlX2hpZCA9PSBISURfQU5ZX0lEIHx8CisJCQkJaWQtPnVzYWdlX2hpZCA9PSB1c2FnZS0+aGlkKSAmJgorCQkJCShpZC0+dXNhZ2VfdHlwZSA9PSBISURfQU5ZX0lEIHx8CisJCQkJaWQtPnVzYWdlX3R5cGUgPT0gdXNhZ2UtPnR5cGUpICYmCisJCQkJKGlkLT51c2FnZV9jb2RlID09IEhJRF9BTllfSUQgfHwKKwkJCQkgaWQtPnVzYWdlX2NvZGUgPT0gdXNhZ2UtPmNvZGUpKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhpZF9wcm9jZXNzX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUsIGludCBpbnRlcnJ1cHQpCit7CisJc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYgPSBoaWQtPmRyaXZlcjsKKwlpbnQgcmV0OworCiAJaGlkX2R1bXBfaW5wdXQodXNhZ2UsIHZhbHVlKTsKKworCWlmIChoZHJ2ICYmIGhkcnYtPmV2ZW50ICYmIGhpZF9tYXRjaF91c2FnZShoaWQsIHVzYWdlKSkgeworCQlyZXQgPSBoZHJ2LT5ldmVudChoaWQsIGZpZWxkLCB1c2FnZSwgdmFsdWUpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWRiZ19oaWQoIiVzJ3MgZXZlbnQgZmFpbGVkIHdpdGggJWRcbiIsCisJCQkJCQloZHJ2LT5uYW1lLCByZXQpOworCQkJcmV0dXJuOworCQl9CisJfQorCiAJaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQogCQloaWRpbnB1dF9oaWRfZXZlbnQoaGlkLCBmaWVsZCwgdXNhZ2UsIHZhbHVlKTsKIAlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWICYmIGludGVycnVwdCAmJiBoaWQtPmhpZGRldl9oaWRfZXZlbnQpCkBAIC05NDYsNDQgKzEwMDEsNDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGhpZF9zZXRfZmllbGQpOwogCi1pbnQgaGlkX2lucHV0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBpbnQgdHlwZSwgdTggKmRhdGEsIGludCBzaXplLCBpbnQgaW50ZXJydXB0KQorc3RhdGljIHN0cnVjdCBoaWRfcmVwb3J0ICpoaWRfZ2V0X3JlcG9ydChzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZXBvcnRfZW51bSwKKwkJY29uc3QgdTggKmRhdGEpCit7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwl1bnNpZ25lZCBpbnQgbiA9IDA7CS8qIE5vcm1hbGx5IHJlcG9ydCBudW1iZXIgaXMgMCAqLworCisJLyogRGV2aWNlIHVzZXMgbnVtYmVyZWQgcmVwb3J0cywgZGF0YVswXSBpcyByZXBvcnQgbnVtYmVyICovCisJaWYgKHJlcG9ydF9lbnVtLT5udW1iZXJlZCkKKwkJbiA9ICpkYXRhOworCisJcmVwb3J0ID0gcmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW25dOworCWlmIChyZXBvcnQgPT0gTlVMTCkKKwkJZGJnX2hpZCgidW5kZWZpbmVkIHJlcG9ydF9pZCAldSByZWNlaXZlZFxuIiwgbik7CisKKwlyZXR1cm4gcmVwb3J0OworfQorCit2b2lkIGhpZF9yZXBvcnRfcmF3X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIGludCB0eXBlLCB1OCAqZGF0YSwgaW50IHNpemUsCisJCWludCBpbnRlcnJ1cHQpCiB7CiAJc3RydWN0IGhpZF9yZXBvcnRfZW51bSAqcmVwb3J0X2VudW0gPSBoaWQtPnJlcG9ydF9lbnVtICsgdHlwZTsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotCWludCBuLCByc2l6ZSwgaTsKKwl1bnNpZ25lZCBpbnQgYTsKKwlpbnQgcnNpemUsIGNzaXplID0gc2l6ZTsKKwl1OCAqY2RhdGEgPSBkYXRhOwogCi0JaWYgKCFoaWQpCi0JCXJldHVybiAtRU5PREVWOworCXJlcG9ydCA9IGhpZF9nZXRfcmVwb3J0KHJlcG9ydF9lbnVtLCBkYXRhKTsKKwlpZiAoIXJlcG9ydCkKKwkJcmV0dXJuOwogCi0JaWYgKCFzaXplKSB7Ci0JCWRiZ19oaWQoImVtcHR5IHJlcG9ydFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlkYmdfaGlkKCJyZXBvcnQgKHNpemUgJXUpICglc251bWJlcmVkKVxuIiwgc2l6ZSwgcmVwb3J0X2VudW0tPm51bWJlcmVkID8gIiIgOiAidW4iKTsKLQotCW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsbHkgcmVwb3J0IG51bWJlciBpcyAwICovCi0JaWYgKHJlcG9ydF9lbnVtLT5udW1iZXJlZCkgeyAgICAvKiBEZXZpY2UgdXNlcyBudW1iZXJlZCByZXBvcnRzLCBkYXRhWzBdIGlzIHJlcG9ydCBudW1iZXIgKi8KLQkJbiA9ICpkYXRhKys7Ci0JCXNpemUtLTsKLQl9Ci0KLQkvKiBkdW1wIHRoZSByZXBvcnQgKi8KLQlkYmdfaGlkKCJyZXBvcnQgJWQgKHNpemUgJXUpID0gIiwgbiwgc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJZGJnX2hpZF9saW5lKCIgJTAyeCIsIGRhdGFbaV0pOwotCWRiZ19oaWRfbGluZSgiXG4iKTsKLQotCWlmICghKHJlcG9ydCA9IHJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtuXSkpIHsKLQkJZGJnX2hpZCgidW5kZWZpbmVkIHJlcG9ydF9pZCAlZCByZWNlaXZlZFxuIiwgbik7Ci0JCXJldHVybiAtMTsKKwlpZiAocmVwb3J0X2VudW0tPm51bWJlcmVkKSB7CisJCWNkYXRhKys7CisJCWNzaXplLS07CiAJfQogCiAJcnNpemUgPSAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMTsKIAotCWlmIChzaXplIDwgcnNpemUpIHsKLQkJZGJnX2hpZCgicmVwb3J0ICVkIGlzIHRvbyBzaG9ydCwgKCVkIDwgJWQpXG4iLCByZXBvcnQtPmlkLCBzaXplLCByc2l6ZSk7Ci0JCW1lbXNldChkYXRhICsgc2l6ZSwgMCwgcnNpemUgLSBzaXplKTsKKwlpZiAoY3NpemUgPCByc2l6ZSkgeworCQlkYmdfaGlkKCJyZXBvcnQgJWQgaXMgdG9vIHNob3J0LCAoJWQgPCAlZClcbiIsIHJlcG9ydC0+aWQsCisJCQkJY3NpemUsIHJzaXplKTsKKwkJbWVtc2V0KGNkYXRhICsgY3NpemUsIDAsIHJzaXplIC0gY3NpemUpOwogCX0KIAogCWlmICgoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWKSAmJiBoaWQtPmhpZGRldl9yZXBvcnRfZXZlbnQpCkBAIC05OTYsMjQgKzEwNTQsNjYxIEBACiAJCQloaWRyYXdfcmVwb3J0X2V2ZW50KGhpZCwgZGF0YSwgc2l6ZSk7CiAJfQogCi0JZm9yIChuID0gMDsgbiA8IHJlcG9ydC0+bWF4ZmllbGQ7IG4rKykKLQkJaGlkX2lucHV0X2ZpZWxkKGhpZCwgcmVwb3J0LT5maWVsZFtuXSwgZGF0YSwgaW50ZXJydXB0KTsKKwlmb3IgKGEgPSAwOyBhIDwgcmVwb3J0LT5tYXhmaWVsZDsgYSsrKQorCQloaWRfaW5wdXRfZmllbGQoaGlkLCByZXBvcnQtPmZpZWxkW2FdLCBjZGF0YSwgaW50ZXJydXB0KTsKIAogCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkKIAkJaGlkaW5wdXRfcmVwb3J0X2V2ZW50KGhpZCwgcmVwb3J0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZF9yZXBvcnRfcmF3X2V2ZW50KTsKKworLyoqCisgKiBoaWRfaW5wdXRfcmVwb3J0IC0gcmVwb3J0IGRhdGEgZnJvbSBsb3dlciBsYXllciAodXNiLCBidC4uLikKKyAqCisgKiBAaGlkOiBoaWQgZGV2aWNlCisgKiBAdHlwZTogSElEIHJlcG9ydCB0eXBlIChISURfKl9SRVBPUlQpCisgKiBAZGF0YTogcmVwb3J0IGNvbnRlbnRzCisgKiBAc2l6ZTogc2l6ZSBvZiBkYXRhIHBhcmFtZXRlcgorICogQGludGVycnVwdDogY2FsbGVkIGZyb20gYXRvbWljPworICoKKyAqIFRoaXMgaXMgZGF0YSBlbnRyeSBmb3IgbG93ZXIgbGF5ZXJzLgorICovCitpbnQgaGlkX2lucHV0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBpbnQgdHlwZSwgdTggKmRhdGEsIGludCBzaXplLCBpbnQgaW50ZXJydXB0KQoreworCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gKnJlcG9ydF9lbnVtID0gaGlkLT5yZXBvcnRfZW51bSArIHR5cGU7CisJc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYgPSBoaWQtPmRyaXZlcjsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlpZiAoIWhpZCB8fCAhaGlkLT5kcml2ZXIpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFzaXplKSB7CisJCWRiZ19oaWQoImVtcHR5IHJlcG9ydFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkYmdfaGlkKCJyZXBvcnQgKHNpemUgJXUpICglc251bWJlcmVkKVxuIiwgc2l6ZSwgcmVwb3J0X2VudW0tPm51bWJlcmVkID8gIiIgOiAidW4iKTsKKworCXJlcG9ydCA9IGhpZF9nZXRfcmVwb3J0KHJlcG9ydF9lbnVtLCBkYXRhKTsKKwlpZiAoIXJlcG9ydCkKKwkJcmV0dXJuIC0xOworCisJLyogZHVtcCB0aGUgcmVwb3J0ICovCisJZGJnX2hpZCgicmVwb3J0ICVkIChzaXplICV1KSA9ICIsIHJlcG9ydC0+aWQsIHNpemUpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWRiZ19oaWRfbGluZSgiICUwMngiLCBkYXRhW2ldKTsKKwlkYmdfaGlkX2xpbmUoIlxuIik7CisKKwlpZiAoaGRydiAmJiBoZHJ2LT5yYXdfZXZlbnQgJiYgaGlkX21hdGNoX3JlcG9ydChoaWQsIHJlcG9ydCkpIHsKKwkJcmV0ID0gaGRydi0+cmF3X2V2ZW50KGhpZCwgcmVwb3J0LCBkYXRhLCBzaXplKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOworCX0KKworCWhpZF9yZXBvcnRfcmF3X2V2ZW50KGhpZCwgdHlwZSwgZGF0YSwgc2l6ZSwgaW50ZXJydXB0KTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2lucHV0X3JlcG9ydCk7CiAKK3N0YXRpYyBib29sIGhpZF9tYXRjaF9vbmVfaWQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gaWQtPmJ1cyA9PSBoZGV2LT5idXMgJiYKKwkJKGlkLT52ZW5kb3IgPT0gSElEX0FOWV9JRCB8fCBpZC0+dmVuZG9yID09IGhkZXYtPnZlbmRvcikgJiYKKwkJKGlkLT5wcm9kdWN0ID09IEhJRF9BTllfSUQgfHwgaWQtPnByb2R1Y3QgPT0gaGRldi0+cHJvZHVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaGlkX21hdGNoX2lkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAorCQljb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJZm9yICg7IGlkLT5idXM7IGlkKyspCisJCWlmIChoaWRfbWF0Y2hfb25lX2lkKGhkZXYsIGlkKSkKKwkJCXJldHVybiBpZDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgaGlkX2hpZGRldl9saXN0W10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01HRSwgVVNCX0RFVklDRV9JRF9NR0VfVVBTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUzEpIH0sCisJeyB9Cit9OworCitzdGF0aWMgYm9vbCBoaWRfaGlkZGV2KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXJldHVybiAhIWhpZF9tYXRjaF9pZChoZGV2LCBoaWRfaGlkZGV2X2xpc3QpOworfQorCitpbnQgaGlkX2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHVuc2lnbmVkIGludCBjb25uZWN0X21hc2spCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVzW10gPSB7ICJEZXZpY2UiLCAiUG9pbnRlciIsICJNb3VzZSIsICJEZXZpY2UiLAorCQkiSm95c3RpY2siLCAiR2FtZXBhZCIsICJLZXlib2FyZCIsICJLZXlwYWQiLAorCQkiTXVsdGktQXhpcyBDb250cm9sbGVyIgorCX07CisJY29uc3QgY2hhciAqdHlwZSwgKmJ1czsKKwljaGFyIGJ1Zls2NF07CisJdW5zaWduZWQgaW50IGk7CisJaW50IGxlbjsKKworCWlmIChoZGV2LT5idXMgIT0gQlVTX1VTQikKKwkJY29ubmVjdF9tYXNrICY9IH5ISURfQ09OTkVDVF9ISURERVY7CisJaWYgKGhpZF9oaWRkZXYoaGRldikpCisJCWNvbm5lY3RfbWFzayB8PSBISURfQ09OTkVDVF9ISURERVZfRk9SQ0U7CisKKwlpZiAoKGNvbm5lY3RfbWFzayAmIEhJRF9DT05ORUNUX0hJRElOUFVUKSAmJiAhaGlkaW5wdXRfY29ubmVjdChoZGV2LAorCQkJCWNvbm5lY3RfbWFzayAmIEhJRF9DT05ORUNUX0hJRElOUFVUX0ZPUkNFKSkKKwkJaGRldi0+Y2xhaW1lZCB8PSBISURfQ0xBSU1FRF9JTlBVVDsKKwlpZiAoKGNvbm5lY3RfbWFzayAmIEhJRF9DT05ORUNUX0hJRERFVikgJiYgaGRldi0+aGlkZGV2X2Nvbm5lY3QgJiYKKwkJCSFoZGV2LT5oaWRkZXZfY29ubmVjdChoZGV2LAorCQkJCWNvbm5lY3RfbWFzayAmIEhJRF9DT05ORUNUX0hJRERFVl9GT1JDRSkpCisJCWhkZXYtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSElEREVWOworCWlmICgoY29ubmVjdF9tYXNrICYgSElEX0NPTk5FQ1RfSElEUkFXKSAmJiAhaGlkcmF3X2Nvbm5lY3QoaGRldikpCisJCWhkZXYtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSElEUkFXOworCisJaWYgKCFoZGV2LT5jbGFpbWVkKSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImNsYWltZWQgYnkgbmVpdGhlciBpbnB1dCwgaGlkZGV2IG5vciAiCisJCQkJImhpZHJhd1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgoaGRldi0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKSAmJgorCQkJKGNvbm5lY3RfbWFzayAmIEhJRF9DT05ORUNUX0ZGKSAmJiBoZGV2LT5mZl9pbml0KQorCQloZGV2LT5mZl9pbml0KGhkZXYpOworCisJbGVuID0gMDsKKwlpZiAoaGRldi0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJpbnB1dCIpOworCWlmIChoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlc2hpZGRldiVkIiwgbGVuID8gIiwiIDogIiIsCisJCQkJaGRldi0+bWlub3IpOworCWlmIChoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEUkFXKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlc2hpZHJhdyVkIiwgbGVuID8gIiwiIDogIiIsCisJCQkJKChzdHJ1Y3QgaGlkcmF3ICopaGRldi0+aGlkcmF3KS0+bWlub3IpOworCisJdHlwZSA9ICJEZXZpY2UiOworCWZvciAoaSA9IDA7IGkgPCBoZGV2LT5tYXhjb2xsZWN0aW9uOyBpKyspIHsKKwkJc3RydWN0IGhpZF9jb2xsZWN0aW9uICpjb2wgPSAmaGRldi0+Y29sbGVjdGlvbltpXTsKKwkJaWYgKGNvbC0+dHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJgorCQkgICAoY29sLT51c2FnZSAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfR0VOREVTSyAmJgorCQkgICAoY29sLT51c2FnZSAmIDB4ZmZmZikgPCBBUlJBWV9TSVpFKHR5cGVzKSkgeworCQkJdHlwZSA9IHR5cGVzW2NvbC0+dXNhZ2UgJiAweGZmZmZdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGhkZXYtPmJ1cykgeworCWNhc2UgQlVTX1VTQjoKKwkJYnVzID0gIlVTQiI7CisJCWJyZWFrOworCWNhc2UgQlVTX0JMVUVUT09USDoKKwkJYnVzID0gIkJMVUVUT09USCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJ1cyA9ICI8VU5LTk9XTj4iOworCX0KKworCWRldl9pbmZvKCZoZGV2LT5kZXYsICIlczogJXMgSElEIHYleC4lMDJ4ICVzIFslc10gb24gJXNcbiIsCisJCQlidWYsIGJ1cywgaGRldi0+dmVyc2lvbiA+PiA4LCBoZGV2LT52ZXJzaW9uICYgMHhmZiwKKwkJCXR5cGUsIGhkZXYtPm5hbWUsIGhkZXYtPnBoeXMpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChoaWRfY29ubmVjdCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBoaWRfYmxhY2tsaXN0W10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0E0VEVDSCwgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9YNV8wMDVEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BVFZfSVJDT05UUk9MKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9JUkNPTlRST0w0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9NSUdIVFlNT1VTRSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVZFUk1FRElBLCBVU0JfREVWSUNFX0lEX0FWRVJfRk1fTVI4MDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JFTEtJTiwgVVNCX0RFVklDRV9JRF9GTElQX0tWTSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQlJJR0hULCBVU0JfREVWSUNFX0lEX0JSSUdIVF9BQk5UMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1RBQ1RJQ0FMX1BBRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX01PVVNFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUxMLCBVU0JfREVWSUNFX0lEX0RFTExfVzc2NTgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RFTEwsIFVTQl9ERVZJQ0VfSURfREVMTF9TSzgxMTUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VaS0VZLCBVU0JfREVWSUNFX0lEX0JUQ184MTkzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HWVJBVElPTiwgVVNCX0RFVklDRV9JRF9HWVJBVElPTl9SRU1PVEUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xBQlRFQywgVVNCX0RFVklDRV9JRF9MQUJURUNfV0lSRUxFU1NfS0VZQk9BUkQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX01YMzAwMF9SRUNFSVZFUikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SRUNFSVZFUikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX0RFU0tUT1ApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19FREdFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fTUlOSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfS0JEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FTElURV9LQkQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0xYMykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfVjE1MCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRVhUUkVNRV8zRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUwpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUlVNQkxFUEFEMl8yKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSU5HTUFOX0YzRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRk9SQ0UzRF9QUk8pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PTU9fV0hFRUwpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PTU9fV0hFRUwyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SVU1CTEVQQUQyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfU0lERVdJTkRFUl9HVikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX05FNEspIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19MSzZLKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX1VTQikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX1dJUkVMRVNTX09QVElDQUxfREVTS1RPUF8zXzApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PTlRFUkVZLCBVU0JfREVWSUNFX0lEX0dFTklVU19LQjI5RSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEVUQUxZTlgsIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU09OWSwgVVNCX0RFVklDRV9JRF9TT05ZX1BTM19DT05UUk9MTEVSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TVU5QTFVTLCBVU0JfREVWSUNFX0lEX1NVTlBMVVNfV0RFU0tUT1ApIH0sCisKKwl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDMwYykgfSwKKwl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19CVCkgfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgaGlkX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgaGlkX2RyaXZlciwgZHJpdmVyKTsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBoaWRfZGV2aWNlLCBkZXYpOworCisJaWYgKCFoaWRfbWF0Y2hfaWQoaGRldiwgaGRydi0+aWRfdGFibGUpKQorCQlyZXR1cm4gMDsKKworCS8qIGdlbmVyaWMgd2FudHMgYWxsIG5vbi1ibGFja2xpc3RlZCAqLworCWlmICghc3RybmNtcChoZHJ2LT5uYW1lLCAiZ2VuZXJpYy0iLCA4KSkKKwkJcmV0dXJuICFoaWRfbWF0Y2hfaWQoaGRldiwgaGlkX2JsYWNrbGlzdCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoaWRfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiA9IGNvbnRhaW5lcl9vZihkZXYtPmRyaXZlciwKKwkJCXN0cnVjdCBoaWRfZHJpdmVyLCBkcml2ZXIpOworCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CisJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkOworCWludCByZXQgPSAwOworCisJaWYgKCFoZGV2LT5kcml2ZXIpIHsKKwkJaWQgPSBoaWRfbWF0Y2hfaWQoaGRldiwgaGRydi0+aWRfdGFibGUpOworCQlpZiAoaWQgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWhkZXYtPmRyaXZlciA9IGhkcnY7CisJCWlmIChoZHJ2LT5wcm9iZSkgeworCQkJcmV0ID0gaGRydi0+cHJvYmUoaGRldiwgaWQpOworCQl9IGVsc2UgeyAvKiBkZWZhdWx0IHByb2JlICovCisJCQlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CisJCX0KKwkJaWYgKHJldCkKKwkJCWhkZXYtPmRyaXZlciA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGlkX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CisJc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYgPSBoZGV2LT5kcml2ZXI7CisKKwlpZiAoaGRydikgeworCQlpZiAoaGRydi0+cmVtb3ZlKQorCQkJaGRydi0+cmVtb3ZlKGhkZXYpOworCQllbHNlIC8qIGRlZmF1bHQgcmVtb3ZlICovCisJCQloaWRfaHdfc3RvcChoZGV2KTsKKwkJaGRldi0+ZHJpdmVyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaWRfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiSElEX0lEPSUwNFg6JTA4WDolMDhYIiwKKwkJCWhkZXYtPmJ1cywgaGRldi0+dmVuZG9yLCBoZGV2LT5wcm9kdWN0KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiSElEX05BTUU9JXMiLCBoZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiSElEX1BIWVM9JXMiLCBoZGV2LT5waHlzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiSElEX1VOSVE9JXMiLCBoZGV2LT51bmlxKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9aGlkOmIlMDRYdiUwOFhwJTA4WCIsCisJCQloZGV2LT5idXMsIGhkZXYtPnZlbmRvciwgaGRldi0+cHJvZHVjdCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgaGlkX2J1c190eXBlID0geworCS5uYW1lCQk9ICJoaWQiLAorCS5tYXRjaAkJPSBoaWRfYnVzX21hdGNoLAorCS5wcm9iZQkJPSBoaWRfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gaGlkX2RldmljZV9yZW1vdmUsCisJLnVldmVudAkJPSBoaWRfdWV2ZW50LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGhpZF9pZ25vcmVfbGlzdFtdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEX0ZMQUlSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQURTX1RFQ0gsIFVTQl9ERVZJQ0VfSURfQURTX1RFQ0hfUkFESU9fU0k0NzBYKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzEwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BSVJDQUJMRSwgVVNCX0RFVklDRV9JRF9BSVJDQUJMRTEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FMQ09SLCBVU0JfREVWSUNFX0lEX0FMQ09SX1VTQlJTMjMyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BU1VTLCBVU0JfREVWSUNFX0lEX0FTVVNfTENNKX0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JFUktTSElSRSwgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0lEQywgMHgwMTAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWUdOQUwsIFVTQl9ERVZJQ0VfSURfQ1lHTkFMX1JBRElPX1NJNDcwWCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ01FRElBLCBVU0JfREVWSUNFX0lEX0NNMTA5KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfSElEQ09NKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VBUlRITUFURSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VNX0xUMjApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZLCBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HQU1FUk9OLCBVU0JfREVWSUNFX0lEX0dBTUVST05fRFVBTF9QU1hfQURBUFRPUikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwMykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzMwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzMwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfMF80X0lGX0tJVCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzE2XzE2X0lGX0tJVCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF84XzhfOF9JRl9LSVQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF84XzdfSUZfS0lUKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfOF84X0lGX0tJVCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF9QSElER0VUX01PVE9SQ09OVFJPTCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR09UT1AsIFVTQl9ERVZJQ0VfSURfU1VQRVJfUTIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dPVE9QLCBVU0JfREVWSUNFX0lEX0dPR09QRU4pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dPVE9QLCBVU0JfREVWSUNFX0lEX1BFTlBPV0VSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HUkVFTkFTSUEsIDB4MDAwMykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1JFVEFHTUFDQkVUSCwgVVNCX0RFVklDRV9JRF9HUkVUQUdNQUNCRVRIX0hVRVkpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dSSUZGSU4sIFVTQl9ERVZJQ0VfSURfUE9XRVJNQVRFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HUklGRklOLCBVU0JfREVWSUNFX0lEX1NPVU5ES05PQikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzkwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA1KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA2KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA3KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA4KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA1KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA2KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA3KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA1KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA2KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA3KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA4KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA5KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDA1KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA1KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDcpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0lNQVRJT04sIFVTQl9ERVZJQ0VfSURfRElTQ19TVEFLS0EpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tCR0VBUiwgVVNCX0RFVklDRV9JRF9LQkdFQVJfSkFNU1RVRElPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX0dQRU5fNTYwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9DQVNTWSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfUE9DS0VUQ0FTU1kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX01PQklMRUNBU1NZKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9KV00pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0RNTVApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1VNSVApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9YUkFZMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfVklERU9DT00pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1RFTEVQT1JUKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9ORVRXT1JLQU5BTFlTRVIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfTUFDSElORVRFU1QpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01DQywgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTAyNExTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEyMDhMUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9DSElQLCBVU0JfREVWSUNFX0lEX1BJQ0tJVDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUCwgVVNCX0RFVklDRV9JRF9QSUNLSVQyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9OQVRJT05BTF9TRU1JQ09ORFVDVE9SLCBVU0JfREVWSUNFX0lEX05fU19IQVJNT05ZKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAyMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAzMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAxMDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTA4KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDExOCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAyMDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMzAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDQwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyA1MDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9QQU5KSVQsIDB4MDAwMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEFOSklULCAweDAwMDMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TT1VOREdSQVBILCBVU0JfREVWSUNFX0lEX1NPVU5ER1JBUEhfSU1PTl9MQ0QpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RFTlgsIFVTQl9ERVZJQ0VfSURfVEVOWF9JQlVERFkxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9URU5YLCBVU0JfREVWSUNFX0lEX1RFTlhfSUJVRERZMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVEhSVVNUTUFTVEVSLCAweGIzMDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RIUlVTVE1BU1RFUiwgMHhiMzA0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjY1MSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVEhSVVNUTUFTVEVSLCAweGI2NTQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9TS0lQKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0xDU1BFQykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIEhJRF9BTllfSUQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18yMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfOF84XzRfSUZfS0lUKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ZRUFMSU5LLCBVU0JfREVWSUNFX0lEX1lFQUxJTktfUDFLX1A0S19CMkspIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1pFUk9QTFVTLCAweDAwMDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1pFUk9QTFVTLCAweDAwMzApIH0sCisJeyB9Cit9OworCitzdGF0aWMgYm9vbCBoaWRfaWdub3JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN3aXRjaCAoaGRldi0+dmVuZG9yKSB7CisJY2FzZSBVU0JfVkVORE9SX0lEX0NPREVNRVJDUzoKKwkJLyogaWdub3JlIGFsbCBDb2RlIE1lcmNlbmFyaWVzIElPV2FycmlvciBkZXZpY2VzICovCisJCWlmIChoZGV2LT5wcm9kdWN0ID49IFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPV19GSVJTVCAmJgorCQkJCWhkZXYtPnByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0xBU1QpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfVkVORE9SX0lEX0xPR0lURUNIOgorCQlpZiAoaGRldi0+cHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfRklSU1QgJiYKKwkJCQloZGV2LT5wcm9kdWN0IDw9IFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV9MQVNUKQorCQkJcmV0dXJuIHRydWU7CisJCWJyZWFrOworCX0KKworCXJldHVybiAhIWhpZF9tYXRjaF9pZChoZGV2LCBoaWRfaWdub3JlX2xpc3QpOworfQorCitpbnQgaGlkX2FkZF9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJc3RhdGljIGF0b21pY190IGlkID0gQVRPTUlDX0lOSVQoMCk7CisJaW50IHJldDsKKworCWlmIChXQVJOX09OKGhkZXYtPnN0YXR1cyAmIEhJRF9TVEFUX0FEREVEKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIHdlIG5lZWQgdG8ga2lsbCB0aGVtIGhlcmUsIG90aGVyd2lzZSB0aGV5IHdpbGwgc3RheSBhbGxvY2F0ZWQgdG8KKwkgKiB3YWl0IGZvciBjb21pbmcgZHJpdmVyICovCisJaWYgKGhpZF9pZ25vcmUoaGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJLyogWFhYIGhhY2ssIGFueSBvdGhlciBjbGVhbmVyIHNvbHV0aW9uIDwgMjAgYnVzX2lkIGJ5dGVzPyAqLworCXNwcmludGYoaGRldi0+ZGV2LmJ1c19pZCwgIiUwNFg6JTA0WDolMDRYLiUwNFgiLCBoZGV2LT5idXMsCisJCQloZGV2LT52ZW5kb3IsIGhkZXYtPnByb2R1Y3QsIGF0b21pY19pbmNfcmV0dXJuKCZpZCkpOworCisJcmV0ID0gZGV2aWNlX2FkZCgmaGRldi0+ZGV2KTsKKwlpZiAoIXJldCkKKwkJaGRldi0+c3RhdHVzIHw9IEhJRF9TVEFUX0FEREVEOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZF9hZGRfZGV2aWNlKTsKKworLyoqCisgKiBoaWRfYWxsb2NhdGVfZGV2aWNlIC0gYWxsb2NhdGUgbmV3IGhpZCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGhpZCBkZXZpY2UsIHNvIHRoYXQgaGlkX2Rlc3Ryb3lfZGV2aWNlIG1pZ2h0IGJlCisgKiB1c2VkIHRvIGZyZWUgaXQuCisgKgorICogTmV3IGhpZF9kZXZpY2UgcG9pbnRlciBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgRVJSX1BUUiBlbmNvZGVkCisgKiBlcnJvciB2YWx1ZS4KKyAqLworc3RydWN0IGhpZF9kZXZpY2UgKmhpZF9hbGxvY2F0ZV9kZXZpY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGRldjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhkZXYgPSBremFsbG9jKHNpemVvZigqaGRldiksIEdGUF9LRVJORUwpOworCWlmIChoZGV2ID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmaGRldi0+ZGV2KTsKKwloZGV2LT5kZXYucmVsZWFzZSA9IGhpZF9kZXZpY2VfcmVsZWFzZTsKKwloZGV2LT5kZXYuYnVzID0gJmhpZF9idXNfdHlwZTsKKworCWhkZXYtPmNvbGxlY3Rpb24gPSBrY2FsbG9jKEhJRF9ERUZBVUxUX05VTV9DT0xMRUNUSU9OUywKKwkJCXNpemVvZihzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaGRldi0+Y29sbGVjdGlvbiA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwloZGV2LT5jb2xsZWN0aW9uX3NpemUgPSBISURfREVGQVVMVF9OVU1fQ09MTEVDVElPTlM7CisKKwlmb3IgKGkgPSAwOyBpIDwgSElEX1JFUE9SVF9UWVBFUzsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmaGRldi0+cmVwb3J0X2VudW1baV0ucmVwb3J0X2xpc3QpOworCisJcmV0dXJuIGhkZXY7CitlcnI6CisJcHV0X2RldmljZSgmaGRldi0+ZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2FsbG9jYXRlX2RldmljZSk7CisKK3N0YXRpYyB2b2lkIGhpZF9yZW1vdmVfZGV2aWNlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCWlmIChoZGV2LT5zdGF0dXMgJiBISURfU1RBVF9BRERFRCkgeworCQlkZXZpY2VfZGVsKCZoZGV2LT5kZXYpOworCQloZGV2LT5zdGF0dXMgJj0gfkhJRF9TVEFUX0FEREVEOworCX0KK30KKworLyoqCisgKiBoaWRfZGVzdHJveV9kZXZpY2UgLSBmcmVlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGRldmljZQorICoKKyAqIEBoZGV2OiBoaWQgZGV2aWNlCisgKgorICogSWYgeW91IGFsbG9jYXRlIGhpZF9kZXZpY2UgdGhyb3VnaCBoaWRfYWxsb2NhdGVfZGV2aWNlLCB5b3Ugc2hvdWxkIGV2ZXIKKyAqIGZyZWUgYnkgdGhpcyBmdW5jdGlvbi4KKyAqLwordm9pZCBoaWRfZGVzdHJveV9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJaGlkX3JlbW92ZV9kZXZpY2UoaGRldik7CisJcHV0X2RldmljZSgmaGRldi0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZF9kZXN0cm95X2RldmljZSk7CisKK2ludCBfX2hpZF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyLAorCQljb25zdCBjaGFyICptb2RfbmFtZSkKK3sKKwloZHJ2LT5kcml2ZXIubmFtZSA9IGhkcnYtPm5hbWU7CisJaGRydi0+ZHJpdmVyLmJ1cyA9ICZoaWRfYnVzX3R5cGU7CisJaGRydi0+ZHJpdmVyLm93bmVyID0gb3duZXI7CisJaGRydi0+ZHJpdmVyLm1vZF9uYW1lID0gbW9kX25hbWU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZoZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19oaWRfcmVnaXN0ZXJfZHJpdmVyKTsKKwordm9pZCBoaWRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmhkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChoaWRfdW5yZWdpc3Rlcl9kcml2ZXIpOworCisjaWZkZWYgQ09ORklHX0hJRF9DT01QQVQKK3N0YXRpYyB2b2lkIGhpZF9jb21wYXRfbG9hZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCXJlcXVlc3RfbW9kdWxlKCJoaWQtZHVtbXkiKTsKK30KK3N0YXRpYyBERUNMQVJFX1dPUksoaGlkX2NvbXBhdF93b3JrLCBoaWRfY29tcGF0X2xvYWQpOworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpoaWRfY29tcGF0X3dxOworI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IGhpZF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGhpZHJhd19pbml0KCk7CisJaW50IHJldDsKKworCXJldCA9IGJ1c19yZWdpc3RlcigmaGlkX2J1c190eXBlKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSElEOiBjYW4ndCByZWdpc3RlciBoaWQgYnVzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkcmF3X2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9idXM7CisKKyNpZmRlZiBDT05GSUdfSElEX0NPTVBBVAorCWhpZF9jb21wYXRfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJoaWRfY29tcGF0Iik7CisJaWYgKCFoaWRfY29tcGF0X3dxKSB7CisJCWhpZHJhd19leGl0KCk7CisJCWdvdG8gZXJyOworCX0KKwlxdWV1ZV93b3JrKGhpZF9jb21wYXRfd3EsICZoaWRfY29tcGF0X3dvcmspOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK2Vycl9idXM6CisJYnVzX3VucmVnaXN0ZXIoJmhpZF9idXNfdHlwZSk7CitlcnI6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGhpZF9leGl0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0hJRF9DT01QQVQKKwlkZXN0cm95X3dvcmtxdWV1ZShoaWRfY29tcGF0X3dxKTsKKyNlbmRpZgogCWhpZHJhd19leGl0KCk7CisJYnVzX3VucmVnaXN0ZXIoJmhpZF9idXNfdHlwZSk7CiB9CiAKIG1vZHVsZV9pbml0KGhpZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jeXByZXNzLmMgYi9kcml2ZXJzL2hpZC9oaWQtY3lwcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtY3lwcmVzcy5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgY3lwcmVzcyAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjZGVmaW5lIENQX1JERVNDX1NXQVBQRURfTUlOX01BWAkweDAxCisjZGVmaW5lIENQXzJXSEVFTF9NT1VTRV9IQUNLCQkweDAyCisjZGVmaW5lIENQXzJXSEVFTF9NT1VTRV9IQUNLX09OCQkweDA0CisKKy8qCisgKiBTb21lIFVTQiBiYXJjb2RlIHJlYWRlcnMgZnJvbSBjeXByZXNzIGhhdmUgdXNhZ2UgbWluIGFuZCB1c2FnZSBtYXggaW4KKyAqIHRoZSB3cm9uZyBvcmRlcgorICovCitzdGF0aWMgdm9pZCBjcF9yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAorCQl1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIShxdWlya3MgJiBDUF9SREVTQ19TV0FQUEVEX01JTl9NQVgpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgcnNpemUgLSA0OyBpKyspCisJCWlmIChyZGVzY1tpXSA9PSAweDI5ICYmIHJkZXNjW2kgKyAyXSA9PSAweDE5KSB7CisJCQlfX3U4IHRtcDsKKworCQkJcmRlc2NbaV0gPSAweDE5OworCQkJcmRlc2NbaSArIDJdID0gMHgyOTsKKwkJCXRtcCA9IHJkZXNjW2kgKyAzXTsKKwkJCXJkZXNjW2kgKyAzXSA9IHJkZXNjW2kgKyAxXTsKKwkJCXJkZXNjW2kgKyAxXSA9IHRtcDsKKwkJfQorfQorCitzdGF0aWMgaW50IGNwX2lucHV0X21hcHBlZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoIShxdWlya3MgJiBDUF8yV0hFRUxfTU9VU0VfSEFDSykpCisJCXJldHVybiAwOworCisJaWYgKHVzYWdlLT50eXBlID09IEVWX1JFTCAmJiB1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwpCisJCXNldF9iaXQoUkVMX0hXSEVFTCwgKmJpdCk7CisJaWYgKHVzYWdlLT5oaWQgPT0gMHgwMDA5MDAwNSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3BfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoIShoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpIHx8ICFmaWVsZC0+aGlkaW5wdXQgfHwKKwkJCSF1c2FnZS0+dHlwZSB8fCAhKHF1aXJrcyAmIENQXzJXSEVFTF9NT1VTRV9IQUNLKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KSB7CisJCWlmICh2YWx1ZSkKKwkJCXF1aXJrcyB8PSAgQ1BfMldIRUVMX01PVVNFX0hBQ0tfT047CisJCWVsc2UKKwkJCXF1aXJrcyAmPSB+Q1BfMldIRUVMX01PVVNFX0hBQ0tfT047CisJCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCAodm9pZCAqKXF1aXJrcyk7CisJCXJldHVybiAxOworCX0KKworCWlmICh1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwgJiYgKHF1aXJrcyAmIENQXzJXSEVFTF9NT1VTRV9IQUNLX09OKSkgeworCQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQ7CisKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCBSRUxfSFdIRUVMLCB2YWx1ZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSBpZC0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKworCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCAodm9pZCAqKXF1aXJrcyk7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgY3BfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xKSwKKwkJLmRyaXZlcl9kYXRhID0gQ1BfUkRFU0NfU1dBUFBFRF9NSU5fTUFYIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIpLAorCQkuZHJpdmVyX2RhdGEgPSBDUF9SREVTQ19TV0FQUEVEX01JTl9NQVggfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX01PVVNFKSwKKwkJLmRyaXZlcl9kYXRhID0gQ1BfMldIRUVMX01PVVNFX0hBQ0sgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgY3BfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBjcF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY3lwcmVzcyIsCisJLmlkX3RhYmxlID0gY3BfZGV2aWNlcywKKwkucmVwb3J0X2ZpeHVwID0gY3BfcmVwb3J0X2ZpeHVwLAorCS5pbnB1dF9tYXBwZWQgPSBjcF9pbnB1dF9tYXBwZWQsCisJLmV2ZW50ID0gY3BfZXZlbnQsCisJLnByb2JlID0gY3BfcHJvYmUsCit9OworCitzdGF0aWMgaW50IGNwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmY3BfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgY3BfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmY3BfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3BfaW5pdCk7Cittb2R1bGVfZXhpdChjcF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihjeXByZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1kZWxsLmMgYi9kcml2ZXJzL2hpZC9oaWQtZGVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMGQwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtZGVsbC5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBkZWxsICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCitzdGF0aWMgaW50IGRlbGxfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXVzYmhpZF9zZXRfbGVkcyhoZGV2KTsKKworCXJldHVybiAwOworZXJyX2ZyZWU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGRlbGxfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUxMLCBVU0JfREVWSUNFX0lEX0RFTExfVzc2NTgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RFTEwsIFVTQl9ERVZJQ0VfSURfREVMTF9TSzgxMTUpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGRlbGxfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBkZWxsX2RyaXZlciA9IHsKKwkubmFtZSA9ICJkZWxsIiwKKwkuaWRfdGFibGUgPSBkZWxsX2RldmljZXMsCisJLnByb2JlID0gZGVsbF9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgZGVsbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmRlbGxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgZGVsbF9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZkZWxsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRlbGxfaW5pdCk7Cittb2R1bGVfZXhpdChkZWxsX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGRlbGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWR1bW15LmMgYi9kcml2ZXJzL2hpZC9oaWQtZHVtbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ4Zjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWR1bW15LmMKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisKK3N0YXRpYyBpbnQgX19pbml0IGhpZF9kdW1teV9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0hJRF9BNFRFQ0hfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihhNHRlY2gpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9BUFBMRV9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKGFwcGxlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfQkVMS0lOX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoYmVsa2luKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfQlJJR0hUX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoYnJpZ2h0KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfQ0hFUlJZX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoY2hlcnJ5KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfQ0hJQ09OWV9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKGNoaWNvbnkpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9DWVBSRVNTX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoY3lwcmVzcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX0RFTExfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihkZWxsKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfRVpLRVlfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihlemtleSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX0dZUkFUSU9OX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoZ3lyYXRpb24pOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9MT0dJVEVDSF9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKGxvZ2l0ZWNoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfTUlDUk9TT0ZUX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIobWljcm9zb2Z0KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfTU9OVEVSRVlfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihtb250ZXJleSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX1BBTlRIRVJMT1JEX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIocGFudGhlcmxvcmQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9QRVRBTFlOWF9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKHBldGFseW54KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfU0FNU1VOR19NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKHNhbXN1bmcpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9TT05ZX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoc29ueSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX1NVTlBMVVNfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihzdW5wbHVzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19USFJVU1RNQVNURVJfRkZfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUih0aHJ1c3RtYXN0ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1pFUk9QTFVTX0ZGX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoemVyb3BsdXMpOworI2VuZGlmCisKKwlyZXR1cm4gLUVJTzsKK30KK21vZHVsZV9pbml0KGhpZF9kdW1teV9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWV6a2V5LmMgYi9kcml2ZXJzL2hpZC9oaWQtZXprZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI0MmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWV6a2V5LmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGV6a2V5ICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgZXpfbWFwX3JlbChjKQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsIEVWX1JFTCwgKGMpKQorI2RlZmluZSBlel9tYXBfa2V5KGMpCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwgRVZfS0VZLCAoYykpCisKK3N0YXRpYyBpbnQgZXpfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwljYXNlIDB4MjMwOiBlel9tYXBfa2V5KEJUTl9NT1VTRSk7CWJyZWFrOworCWNhc2UgMHgyMzE6IGV6X21hcF9yZWwoUkVMX1dIRUVMKTsJYnJlYWs7CisJLyoKKwkgKiB0aGlzIGtleWJvYXJkIGhhcyBhIHNjcm9sbHdoZWVsIGltcGxlbWVudGVkIGluCisJICogdG90YWxseSBicm9rZW4gd2F5LiBXZSBtYXAgdGhpcyB1c2FnZSB0ZW1wb3JhcmlseQorCSAqIHRvIEhXSEVFTCBhbmQgaGFuZGxlIGl0IGluIHRoZSBldmVudCBxdWlyayBoYW5kbGVyCisJICovCisJY2FzZSAweDIzMjogZXpfbWFwX3JlbChSRUxfSFdIRUVMKTsJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGV6X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCWlmICghKGhkZXYtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkgfHwgIWZpZWxkLT5oaWRpbnB1dCB8fAorCQkJIXVzYWdlLT50eXBlKQorCQlyZXR1cm4gMDsKKworCS8qIGhhbmRsZSB0aGUgdGVtcG9yYXJ5IHF1aXJreSBtYXBwaW5nIHRvIEhXSEVFTCAqLworCWlmICh1c2FnZS0+dHlwZSA9PSBFVl9SRUwgJiYgdXNhZ2UtPmNvZGUgPT0gUkVMX0hXSEVFTCkgeworCQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQ7CisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgUkVMX1dIRUVMLCAtdmFsdWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGV6X2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVpLRVksIFVTQl9ERVZJQ0VfSURfQlRDXzgxOTMpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGV6X2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgZXpfZHJpdmVyID0geworCS5uYW1lID0gImV6a2V5IiwKKwkuaWRfdGFibGUgPSBlel9kZXZpY2VzLAorCS5pbnB1dF9tYXBwaW5nID0gZXpfaW5wdXRfbWFwcGluZywKKwkuZXZlbnQgPSBlel9ldmVudCwKK307CisKK3N0YXRpYyBpbnQgZXpfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZlel9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBlel9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZlel9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlel9pbml0KTsKK21vZHVsZV9leGl0KGV6X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGV6a2V5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1neXJhdGlvbi5jIGIvZHJpdmVycy9oaWQvaGlkLWd5cmF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1MTIwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1neXJhdGlvbi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBneXJhdGlvbiAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjZGVmaW5lIGd5X21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorc3RhdGljIGludCBneXJhdGlvbl9pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0xPR0lWRU5ET1IpCisJCXJldHVybiAwOworCisJc2V0X2JpdChFVl9SRVAsIGhpLT5pbnB1dC0+ZXZiaXQpOworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCS8qIFJlcG9ydGVkIG9uIEd5cmF0aW9uIE1DRSBSZW1vdGUgKi8KKwljYXNlIDB4MDBkOiBneV9tYXBfa2V5X2NsZWFyKEtFWV9IT01FKTsJCWJyZWFrOworCWNhc2UgMHgwMjQ6IGd5X21hcF9rZXlfY2xlYXIoS0VZX0RWRCk7CQlicmVhazsKKwljYXNlIDB4MDI1OiBneV9tYXBfa2V5X2NsZWFyKEtFWV9QVlIpOwkJYnJlYWs7CisJY2FzZSAweDA0NjogZ3lfbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwlicmVhazsKKwljYXNlIDB4MDQ3OiBneV9tYXBfa2V5X2NsZWFyKEtFWV9NUDMpOwkJYnJlYWs7CisJY2FzZSAweDA0OTogZ3lfbWFwX2tleV9jbGVhcihLRVlfQ0FNRVJBKTsJYnJlYWs7CisJY2FzZSAweDA0YTogZ3lfbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBneXJhdGlvbl9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQ7CisKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0dFTkRFU0sgJiYKKwkJCSh1c2FnZS0+aGlkICYgMHhmZikgPT0gMHg4MikgeworCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCAxKTsKKwkJaW5wdXRfc3luYyhpbnB1dCk7CisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIDApOworCQlpbnB1dF9zeW5jKGlucHV0KTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBneXJhdGlvbl9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dZUkFUSU9OLCBVU0JfREVWSUNFX0lEX0dZUkFUSU9OX1JFTU9URSkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZ3lyYXRpb25fZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBneXJhdGlvbl9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZ3lyYXRpb24iLAorCS5pZF90YWJsZSA9IGd5cmF0aW9uX2RldmljZXMsCisJLmlucHV0X21hcHBpbmcgPSBneXJhdGlvbl9pbnB1dF9tYXBwaW5nLAorCS5ldmVudCA9IGd5cmF0aW9uX2V2ZW50LAorfTsKKworc3RhdGljIGludCBneXJhdGlvbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmd5cmF0aW9uX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGd5cmF0aW9uX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmd5cmF0aW9uX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGd5cmF0aW9uX2luaXQpOworbW9kdWxlX2V4aXQoZ3lyYXRpb25fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoZ3lyYXRpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDllZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiAgVVNCIEhJRCBxdWlya3Mgc3VwcG9ydCBmb3IgTGludXgKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBISURfSURTX0hfRklMRQorI2RlZmluZSBISURfSURTX0hfRklMRQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQTRURUNICQkweDA5ZGEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVQkweDAwMDYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BNFRFQ0hfWDVfMDA1RAkweDAwMGEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FBU0hJTUEJCTB4MDZkNgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FBU0hJTUFfR0FNRVBBRAkweDAwMjUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQVNISU1BX1BSRURBVE9SCTB4MDAyNgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUNFQ0FECQkweDA0NjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQ0VDQURfRkxBSVIJMHgwMDA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMgkweDAwMDgKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FEU19URUNIIAkJMHgwNmUxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQURTX1RFQ0hfUkFESU9fU0k0NzBYCTB4YTE1NQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUZBVEVDSAkJMHgxNWE0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUZBVEVDSF9BRjkwMTYJMHg5MDE2CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BSVBURUsJCTB4MDhjYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18wMQkJMHgwMDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzEwCQkweDAwMTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjAJCTB4MDAyMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yMQkJMHgwMDIxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIyCQkweDAwMjIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjMJCTB4MDAyMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yNAkJMHgwMDI0CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BSVJDQUJMRQkJMHgxNkNBCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlSQ0FCTEUxCQkweDE1MDIKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FMQ09SCQkweDA1OGYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BTENPUl9VU0JSUzIzMgkweDk3MjAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FMUFMJCTB4MDQzMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0lCTV9HQU1FUEFECTB4MTEwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQVBQTEUJCTB4MDVhYworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX01JR0hUWU1PVVNFCTB4MDMwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0FOU0kJMHgwMjBlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fSVNPCTB4MDIwZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9BTlNJCTB4MDIxNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9JU08JMHgwMjE1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0pJUwkweDAyMTYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0FOU0kJMHgwMjE3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19JU08JMHgwMjE4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19KSVMJMHgwMjE5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9BTlNJCTB4MDIxYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPCTB4MDIxYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSklTCTB4MDIxYworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9BTlNJCTB4MDIyMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9JU08JMHgwMjIxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0pJUwkweDAyMjIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0FOU0kJMHgwMjIzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklOR19JU08JMHgwMjI0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklOR19KSVMJMHgwMjI1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9BTlNJICAgIDB4MDIyOQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfSVNPICAgICAweDAyMmEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0pJUyAgICAgMHgwMjJiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0FOU0kgIDB4MDIyYworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19JU08gICAweDAyMmQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfSklTICAgMHgwMjJlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfQU5TSQkweDAyMzAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9JU08JMHgwMjMxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSklTCTB4MDIzMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkJMHgwMzBhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZCTB4MDMwYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FUVl9JUkNPTlRST0wJMHg4MjQxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfSVJDT05UUk9MNAkweDgyNDIKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FTVVMJCTB4MGIwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FTVVNfTENNCQkweDE3MjYKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FURU4JCTB4MDU1NworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fVUMxMDBLTQkweDIwMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOX0NTMTI0VQkweDIyMDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOXzJQT1JUS1ZNCTB4MjIwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fNFBPUlRLVk0JMHgyMjA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl80UE9SVEtWTUMJMHgyMjA4CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BVkVSTUVESUEJCTB4MDdjYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FWRVJfRk1fTVI4MDAJMHhiODAwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9CRUxLSU4gICAgICAgICAgIDB4MDUwZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0ZMSVBfS1ZNICAgICAgICAgMHgzMjAxCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9CUklHSFQJCTB4MTI0MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0JSSUdIVF9BQk5UMgkweDE1MDMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFUktTSElSRQkJMHgwYzk4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QJMHgxMTQwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSEVSUlkJCTB4MDQ2YQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTgkweDAwMjMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NISUMJCTB4MDVmZQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNfR0FNRVBBRAkweDAwMTQKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NISUNPTlkJCTB4MDRmMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFECTB4MDQxOAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0lEQwkJMHgxNjc3CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DTUVESUEJCTB4MGQ4YworI2RlZmluZSBVU0JfREVWSUNFX0lEX0NNMTA5CQkweDAwMGUKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NPREVNRVJDUwkJMHgwN2MwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPV19GSVJTVAkweDE1MDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0xBU1QJMHgxNWZmCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DWUdOQUwJCTB4MTBjNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZR05BTF9SQURJT19TSTQ3MFgJMHg4MThhCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTCQkweDA0YjQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX01PVVNFCTB4MDAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfSElEQ09NCTB4NTUwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRQkweDc0MTcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMQkweGRlNjEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMgkweGRlNjQKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFTEwJCTB4NDEzYworI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTExfVzc2NTgJMHgyMDA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMTF9TSzgxMTUJMHgyMTA1CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ERUxPUk1FCQkweDExNjMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VBUlRITUFURSAweDAxMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VNX0xUMjAJMHgwMjAwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ETUkJCTB4MGMwYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0RNSV9FTkMJCTB4NWZhYgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfRUxPCQkweDA0RTcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9FTE9fVFMyNzAwCTB4MDAyMAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFkJMHgwZDdmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUgMHgwMTAwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9FWktFWSAJCTB4MDUxOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0JUQ184MTkzCQkweDAwMDIKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dBTUVST04JCTB4MDgxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dBTUVST05fRFVBTF9QU1hfQURBUFRPUgkweDAwMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gJMHgwZGZjCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HTEFCCQkweDA2YzIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18zMAkweDAwMzgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18zMAkweDAwMzkKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzBfNF9JRl9LSVQJMHgwMDQwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF8xNl8xNl9JRl9LSVQJMHgwMDQ0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfOF84XzhfSUZfS0lUCTB4MDA0NQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfOF83X0lGX0tJVAkweDAwNTEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzhfOF9JRl9LSVQJMHgwMDUzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEhJREdFVF9NT1RPUkNPTlRST0wJMHgwMDU4CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HT1RPUAkJMHgwOGYyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU1VQRVJfUTIJCTB4MDA3ZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dPR09QRU4JCTB4MDBjZQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BFTlBPV0VSCQkweDAwZjQKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dSRUVOQVNJQQkJMHgwZThmCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HUkVUQUdNQUNCRVRICTB4MDk3MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dSRVRBR01BQ0JFVEhfSFVFWQkweDIwMDUKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dSSUZGSU4JCTB4MDc3ZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPV0VSTUFURQkJMHgwNDEwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09VTkRLTk9CCQkweDA0QUEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dUQ08JCTB4MDc4YworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fOTAJCTB4MDA5MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwCQkweDAxMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMQkJMHgwMTAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDMJCTB4MDEwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA0CQkweDAxMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwNQkJMHgwMTA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDYJCTB4MDEwNgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA3CQkweDAxMDcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwOAkJMHgwMTA4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDAJCTB4MDIwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjAxCQkweDAyMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMgkJMHgwMjAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDMJCTB4MDIwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA0CQkweDAyMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwNQkJMHgwMjA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDYJCTB4MDIwNgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA3CQkweDAyMDcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMAkJMHgwMzAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDEJCTB4MDMwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAyCQkweDAzMDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMwkJMHgwMzAzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDQJCTB4MDMwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA1CQkweDAzMDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNgkJMHgwMzA2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDcJCTB4MDMwNworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA4CQkweDAzMDgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwOQkJMHgwMzA5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDAJCTB4MDQwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDAxCQkweDA0MDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMgkJMHgwNDAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDMJCTB4MDQwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDA0CQkweDA0MDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwNQkJMHgwNDA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDAJCTB4MDUwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAxCQkweDA1MDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMgkJMHgwNTAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDMJCTB4MDUwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTA0CQkweDA1MDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDAJCTB4MTAwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMQkJMHgxMDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAyCQkweDEwMDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDMJCTB4MTAwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNAkJMHgxMDA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA1CQkweDEwMDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDYJCTB4MTAwNgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNwkJMHgxMDA3CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HWVJBVElPTgkJMHgwYzE2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFCTB4MDAwMgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfSEFQUAkJMHgwNzhiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9EUklWSU5HCTB4MDAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRkxZSU5HCTB4MDAyMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRklHSFRJTkcJMHgwMDMwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9JTUFUSU9OCQkweDA3MTgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQQkweGQwMDAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0tCR0VBUgkJMHgwODRlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTwkweDEwMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0xBQlRFQwkJMHgxMDIwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTEFCVEVDX1dJUkVMRVNTX0tFWUJPQVJECTB4MDAwNgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTEQJCTB4MGYxMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX0NBU1NZCQkweDEwMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9QT0NLRVRDQVNTWQkweDEwMTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9NT0JJTEVDQVNTWQkweDEwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9KV00JCTB4MTA4MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX0RNTVAJCTB4MTA4MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1VNSVAJCTB4MTA5MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1hSQVkxCQkweDExMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9YUkFZMgkJMHgxMTAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfVklERU9DT00JMHgxMjAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfQ09NM0xBQgkweDIwMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9URUxFUE9SVAkweDIwMTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9ORVRXT1JLQU5BTFlTRVIgMHgyMDIwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfUE9XRVJDT05UUk9MCTB4MjAzMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX01BQ0hJTkVURVNUCTB4MjA0MAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gJCTB4MDQ2ZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0xYMwkweGMwNDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9WMTUwCTB4YzA0NworI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JFQ0VJVkVSCTB4YzEwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfRklSU1QgIDB4YzExMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfTEFTVCAweGMxNGYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SVU1CTEVQQUQJMHhjMjExCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRVhUUkVNRV8zRAkweGMyMTUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SVU1CTEVQQUQyCTB4YzIxOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDJfMgkweGMyMTkKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSU5HTUFOX0YzRAkweGMyODMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9GT1JDRTNEX1BSTwkweGMyODYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTAkweGMyOTQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT01PX1dIRUVMCTB4YzI5NQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0VMSVRFX0tCRAkweGMzMGEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9LQkQJMHhjMzExCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUgkweGM1MGMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSXzIJMHhjNTE3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfQ09SRExFU1NfREVTS1RPUF9MWDUwMAkweGM1MTIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NWDMwMDBfUkVDRUlWRVIJMHhjNTEzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRElOT1ZPX0RFU0tUT1AJMHhjNzA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRElOT1ZPX0VER0UJMHhjNzE0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRElOT1ZPX01JTkkJMHhjNzFmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9NT19XSEVFTDIJMHhjYTAzCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NQ0MJCTB4MDlkYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX01DQ19QTUQxMDI0TFMJMHgwMDc2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEyMDhMUwkweDAwN2EKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX01HRQkJMHgwNDYzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTUdFX1VQUwkJMHhmZmZmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTUdFX1VQUzEJCTB4MDAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTUlDUk9DSElQCQkweDA0ZDgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QSUNLSVQxCQkweDAwMzIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QSUNLSVQyCQkweDAwMzMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX01JQ1JPU09GVAkJMHgwNDVlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0lERVdJTkRFUl9HVgkweDAwM2IKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wIDB4MDA5ZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX01TX05FNEsJCTB4MDBkYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX01TX0xLNksJCTB4MDBmOQorI2RlZmluZSBVU0JfREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19CVAkweDA3MDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19QUkVTRU5URVJfOEtfVVNCCTB4MDcxMworCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NT05URVJFWQkJMHgwNTY2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR0VOSVVTX0tCMjlFCTB4MzAwNAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkNSCQkweDA0MDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9OQ1JfRklSU1QJCTB4MDMwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX05DUl9MQVNUCQkweDAzZmYKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX05BVElPTkFMX1NFTUlDT05EVUNUT1IgMHgwNDAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTl9TX0hBUk1PTlkgICAgICAgMHhjMzU5CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OQVRTVSAgICAgICAgICAgICAweDA4YjcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9OQVRTVV9HQU1FUEFEICAgICAweDAwMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX05FQwkJMHgwNzNlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkVDX1VTQl9HQU1FX1BBRAkweDAzMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX09OVFJBSwkJMHgwYTA3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMAkweDAwNjQKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1BBTkpJVAkJMHgxMzRjCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QQU5USEVSTE9SRAkweDA4MTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QQU5USEVSTE9SRF9UV0lOX1VTQl9KT1lTVElDSwkweDAwMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1BFVEFMWU5YCQkweDE4YjEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QRVRBTFlOWF9NQVhURVJfUkVNT1RFCTB4MDAzNworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfUExBWURPVENPTQkweDBiNDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QTEFZRE9UQ09NX0VNU19VU0JJSQkweDAwMDMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1NBSVRFSwkJMHgwNmEzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JVTUJMRVBBRAkweGZmMTcKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1NBTVNVTkcJCTB4MDQxOQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1NBTVNVTkdfSVJfUkVNT1RFCTB4MDAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfU09OWQkJCTB4MDU0YworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NPTllfUFMzX0NPTlRST0xMRVIJMHgwMjY4CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TT1VOREdSQVBICTB4MTVjMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1NPVU5ER1JBUEhfSU1PTl9MQ0QJMHgwMDM4CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TVU4JCTB4MDQzMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1JBUklUQU5fS1ZNX0RPTkdMRQkweGNkYWIKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1NVTlBMVVMJCTB4MDRmYworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NVTlBMVVNfV0RFU0tUT1AJMHgwNWQ4CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9URU5YCQkweDExMzAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9URU5YX0lCVUREWTEJMHgwMDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVEVOWF9JQlVERFkyCTB4MDAwMgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVEhSVVNUTUFTVEVSCTB4MDQ0ZgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVE9QTUFYCQkweDA2NjMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9UT1BNQVhfQ09CUkFQQUQJMHgwMTAzCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UVVJCT1gJCTB4MDYyYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRAkweDAyMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1ZFUk5JRVIJCTB4MDhmNworI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPCTB4MDAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfR09URU1QCTB4MDAwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUAkweDAwMDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMJMHgwMDA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQ1NQRUMJMHgwMDA2CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XQUNPTQkJMHgwNTZhCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAJCTB4MDkyNQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwCTB4ODEwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzIwCTB4ODEwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEXzhfOF80X0lGX0tJVAkweDgyMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9RVUFEX1VTQl9KT1lQQUQJMHg4ODAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRFVBTF9VU0JfSk9ZUEFECTB4ODg2NgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfV0lTRUdST1VQX0xURAkweDY2NjYKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVBfTFREMgkweDY2NzcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMgMHg4ODAyCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ZRUFMSU5LCQkweDY5OTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLCTB4YjAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfWkVST1BMVVMJCTB4MGMxMgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfS1lFCQkweDA0NTgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfR1BFTl81NjAJMHg1MDAzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LXF1aXJrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZlZWEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC1xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vKgotICogIEhJRC1pbnB1dCB1c2FnZSBtYXBwaW5nIHF1aXJrcwotICoKLSAqICBUaGlzIGlzIHVzZWQgdG8gaGFuZGxlIEhJRC1pbnB1dCBtYXBwaW5ncyBmb3IgZGV2aWNlcyB2aW9sYXRpbmcKLSAqICBIVVQgMS4xMiBzcGVjaWZpY2F0aW9uLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEppcmkgS29zaW5hCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgotCi0jZGVmaW5lIG1hcF9hYnMoYykgICAgICBkbyB7IHVzYWdlLT5jb2RlID0gYzsgdXNhZ2UtPnR5cGUgPSBFVl9BQlM7ICpiaXQgPSBpbnB1dC0+YWJzYml0OyAqbWF4ID0gQUJTX01BWDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbWFwX3JlbChjKSAgICAgIGRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX1JFTDsgKmJpdCA9IGlucHV0LT5yZWxiaXQ7ICptYXggPSBSRUxfTUFYOyB9IHdoaWxlICgwKQotI2RlZmluZSBtYXBfa2V5KGMpICAgICAgZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfS0VZOyAqYml0ID0gaW5wdXQtPmtleWJpdDsgKm1heCA9IEtFWV9NQVg7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1hcF9sZWQoYykgICAgICBkbyB7IHVzYWdlLT5jb2RlID0gYzsgdXNhZ2UtPnR5cGUgPSBFVl9MRUQ7ICpiaXQgPSBpbnB1dC0+bGVkYml0OyAqbWF4ID0gTEVEX01BWDsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtYXBfYWJzX2NsZWFyKGMpICAgICAgICBkbyB7IG1hcF9hYnMoYyk7IGNsZWFyX2JpdChjLCAqYml0KTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbWFwX2tleV9jbGVhcihjKSAgICAgICAgZG8geyBtYXBfa2V5KGMpOyBjbGVhcl9iaXQoYywgKmJpdCk7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbnQgcXVpcmtfYmVsa2luX3drYmQoc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJY2FzZSAweDAzYTogbWFwX2tleV9jbGVhcihLRVlfU09VTkQpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwM2I6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTUVSQSk7CQlicmVhazsKLQkJY2FzZSAweDAzYzogbWFwX2tleV9jbGVhcihLRVlfRE9DVU1FTlRTKTsJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcXVpcmtfY2hlcnJ5X2N5bW90aW9uKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQotewotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfQ09OU1VNRVIpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCWNhc2UgMHgzMDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cxKTsJCWJyZWFrOwotCQljYXNlIDB4MzAyOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMik7CQlicmVhazsKLQkJY2FzZSAweDMwMzogbWFwX2tleV9jbGVhcihLRVlfUFJPRzMpOwkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcXVpcmtfbG9naXRlY2hfdWx0cmF4X3JlbW90ZShzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0xPR0lWRU5ET1IpCi0JCXJldHVybiAwOwotCi0Jc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7Ci0Jc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJLyogUmVwb3J0ZWQgb24gTG9naXRlY2ggVWx0cmEgWCBNZWRpYSBSZW1vdGUgKi8KLQkJY2FzZSAweDAwNDogbWFwX2tleV9jbGVhcihLRVlfQUdBSU4pOwkJYnJlYWs7Ci0JCWNhc2UgMHgwMGQ6IG1hcF9rZXlfY2xlYXIoS0VZX0hPTUUpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwMjQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NIVUZGTEUpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwMjU6IG1hcF9rZXlfY2xlYXIoS0VZX1RWKTsJCWJyZWFrOwotCQljYXNlIDB4MDI2OiBtYXBfa2V5X2NsZWFyKEtFWV9NRU5VKTsJCWJyZWFrOwotCQljYXNlIDB4MDMxOiBtYXBfa2V5X2NsZWFyKEtFWV9BVURJTyk7CQlicmVhazsKLQkJY2FzZSAweDAzMjogbWFwX2tleV9jbGVhcihLRVlfVEVYVCk7CQlicmVhazsKLQkJY2FzZSAweDAzMzogbWFwX2tleV9jbGVhcihLRVlfTEFTVCk7CQlicmVhazsKLQkJY2FzZSAweDA0NzogbWFwX2tleV9jbGVhcihLRVlfTVAzKTsJCWJyZWFrOwotCQljYXNlIDB4MDQ4OiBtYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwNDk6IG1hcF9rZXlfY2xlYXIoS0VZX01FRElBKTsJCWJyZWFrOwotCQljYXNlIDB4MDRhOiBtYXBfa2V5X2NsZWFyKEtFWV9WSURFTyk7CQlicmVhazsKLQkJY2FzZSAweDA0YjogbWFwX2tleV9jbGVhcihLRVlfQU5HTEUpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwNGM6IG1hcF9rZXlfY2xlYXIoS0VZX0xBTkdVQUdFKTsJYnJlYWs7Ci0JCWNhc2UgMHgwNGQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NVQlRJVExFKTsJYnJlYWs7Ci0JCWNhc2UgMHgwNTE6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKLQkJY2FzZSAweDA1MjogbWFwX2tleV9jbGVhcihLRVlfQ0xPU0UpOwkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19neXJhdGlvbl9yZW1vdGUoc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9MT0dJVkVORE9SKQotCQlyZXR1cm4gMDsKLQotCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOwotCXN3aXRjaCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCS8qIFJlcG9ydGVkIG9uIEd5cmF0aW9uIE1DRSBSZW1vdGUgKi8KLQkJY2FzZSAweDAwZDogbWFwX2tleV9jbGVhcihLRVlfSE9NRSk7CQlicmVhazsKLQkJY2FzZSAweDAyNDogbWFwX2tleV9jbGVhcihLRVlfRFZEKTsJCWJyZWFrOwotCQljYXNlIDB4MDI1OiBtYXBfa2V5X2NsZWFyKEtFWV9QVlIpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwNDY6IG1hcF9rZXlfY2xlYXIoS0VZX01FRElBKTsJCWJyZWFrOwotCQljYXNlIDB4MDQ3OiBtYXBfa2V5X2NsZWFyKEtFWV9NUDMpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwNDk6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTUVSQSk7CQlicmVhazsKLQkJY2FzZSAweDA0YTogbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19jaGljb255X3RhY3RpY2FsX3BhZChzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX01TVkVORE9SKQotCQlyZXR1cm4gMDsKLQotCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOwotCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4ZmYwMTogbWFwX2tleV9jbGVhcihCVE5fMSk7CQlicmVhazsKLQkJY2FzZSAweGZmMDI6IG1hcF9rZXlfY2xlYXIoQlROXzIpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZjAzOiBtYXBfa2V5X2NsZWFyKEJUTl8zKTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwNDogbWFwX2tleV9jbGVhcihCVE5fNCk7CQlicmVhazsKLQkJY2FzZSAweGZmMDU6IG1hcF9rZXlfY2xlYXIoQlROXzUpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZjA2OiBtYXBfa2V5X2NsZWFyKEJUTl82KTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwNzogbWFwX2tleV9jbGVhcihCVE5fNyk7CQlicmVhazsKLQkJY2FzZSAweGZmMDg6IG1hcF9rZXlfY2xlYXIoQlROXzgpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZjA5OiBtYXBfa2V5X2NsZWFyKEJUTl85KTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwYTogbWFwX2tleV9jbGVhcihCVE5fQSk7CQlicmVhazsKLQkJY2FzZSAweGZmMGI6IG1hcF9rZXlfY2xlYXIoQlROX0IpOwkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcXVpcmtfbWljcm9zb2Z0X2VyZ29ub215X2tiKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQotewotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTVNWRU5ET1IpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJY2FzZSAweGZkMDY6IG1hcF9rZXlfY2xlYXIoS0VZX0NIQVQpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZDA3OiBtYXBfa2V5X2NsZWFyKEtFWV9QSE9ORSk7CQlicmVhazsKLQkJY2FzZSAweGZmMDU6Ci0JCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKLQkJCW1hcF9rZXlfY2xlYXIoS0VZX0YxMyk7Ci0JCQlzZXRfYml0KEtFWV9GMTQsIGlucHV0LT5rZXliaXQpOwotCQkJc2V0X2JpdChLRVlfRjE1LCBpbnB1dC0+a2V5Yml0KTsKLQkJCXNldF9iaXQoS0VZX0YxNiwgaW5wdXQtPmtleWJpdCk7Ci0JCQlzZXRfYml0KEtFWV9GMTcsIGlucHV0LT5rZXliaXQpOwotCQkJc2V0X2JpdChLRVlfRjE4LCBpbnB1dC0+a2V5Yml0KTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19taWNyb3NvZnRfcHJlc2VudGVyXzhrKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQotewotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTVNWRU5ET1IpCi0JCXJldHVybiAwOwotCi0Jc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7Ci0Jc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJY2FzZSAweGZkMDg6IG1hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkQpOwlicmVhazsKLQkJY2FzZSAweGZkMDk6IG1hcF9rZXlfY2xlYXIoS0VZX0JBQ0spOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZDBiOiBtYXBfa2V5X2NsZWFyKEtFWV9QTEFZUEFVU0UpOwlicmVhazsKLQkJY2FzZSAweGZkMGU6IG1hcF9rZXlfY2xlYXIoS0VZX0NMT1NFKTsJCWJyZWFrOwotCQljYXNlIDB4ZmQwZjogbWFwX2tleV9jbGVhcihLRVlfUExBWSk7CQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19wZXRhbHlueF9yZW1vdGUoc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTE9HSVZFTkRPUikgJiYKLQkJCSgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfQ09OU1VNRVIpKQotCQlyZXR1cm4gMDsKLQotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfTE9HSVZFTkRPUikKLQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCWNhc2UgMHgwNWE6IG1hcF9rZXlfY2xlYXIoS0VZX1RFWFQpOwkJYnJlYWs7Ci0JCQljYXNlIDB4MDViOiBtYXBfa2V5X2NsZWFyKEtFWV9SRUQpOwkJYnJlYWs7Ci0JCQljYXNlIDB4MDVjOiBtYXBfa2V5X2NsZWFyKEtFWV9HUkVFTik7CQlicmVhazsKLQkJCWNhc2UgMHgwNWQ6IG1hcF9rZXlfY2xlYXIoS0VZX1lFTExPVyk7CQlicmVhazsKLQkJCWNhc2UgMHgwNWU6IG1hcF9rZXlfY2xlYXIoS0VZX0JMVUUpOwkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAwOwotCQl9Ci0KLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0NPTlNVTUVSKQotCQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkJY2FzZSAweDBmNjogbWFwX2tleV9jbGVhcihLRVlfTkVYVCk7ICAgICAgICAgICAgYnJlYWs7Ci0JCQljYXNlIDB4MGZhOiBtYXBfa2V5X2NsZWFyKEtFWV9CQUNLKTsgICAgICAgICAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIDA7Ci0JCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19sb2dpdGVjaF93aXJlbGVzcyhzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4MTAwMTogbWFwX2tleV9jbGVhcihLRVlfTUVTU0VOR0VSKTsJYnJlYWs7Ci0JCWNhc2UgMHgxMDAzOiBtYXBfa2V5X2NsZWFyKEtFWV9TT1VORCk7CQlicmVhazsKLQkJY2FzZSAweDEwMDQ6IG1hcF9rZXlfY2xlYXIoS0VZX1ZJREVPKTsJCWJyZWFrOwotCQljYXNlIDB4MTAwNTogbWFwX2tleV9jbGVhcihLRVlfQVVESU8pOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDBhOiBtYXBfa2V5X2NsZWFyKEtFWV9ET0NVTUVOVFMpOwlicmVhazsKLQkJY2FzZSAweDEwMTE6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVZJT1VTU09ORyk7CWJyZWFrOwotCQljYXNlIDB4MTAxMjogbWFwX2tleV9jbGVhcihLRVlfTkVYVFNPTkcpOwlicmVhazsKLQkJY2FzZSAweDEwMTM6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTUVSQSk7CQlicmVhazsKLQkJY2FzZSAweDEwMTQ6IG1hcF9rZXlfY2xlYXIoS0VZX01FU1NFTkdFUik7CWJyZWFrOwotCQljYXNlIDB4MTAxNTogbWFwX2tleV9jbGVhcihLRVlfUkVDT1JEKTsJCWJyZWFrOwotCQljYXNlIDB4MTAxNjogbWFwX2tleV9jbGVhcihLRVlfUExBWUVSKTsJCWJyZWFrOwotCQljYXNlIDB4MTAxNzogbWFwX2tleV9jbGVhcihLRVlfRUpFQ1RDRCk7CWJyZWFrOwotCQljYXNlIDB4MTAxODogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDE5OiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CQlicmVhazsKLQkJY2FzZSAweDEwMWE6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOwotCQljYXNlIDB4MTAxYjogbWFwX2tleV9jbGVhcihLRVlfUFJPRzMpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDFmOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NSU4pOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDIwOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NT1VUKTsJYnJlYWs7Ci0JCWNhc2UgMHgxMDIxOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NUkVTRVQpOwlicmVhazsKLQkJY2FzZSAweDEwMjM6IG1hcF9rZXlfY2xlYXIoS0VZX0NMT1NFKTsJCWJyZWFrOwotCQljYXNlIDB4MTAyNzogbWFwX2tleV9jbGVhcihLRVlfTUVOVSk7CQlicmVhazsKLQkJLyogdGhpcyBvbmUgaXMgbWFya2VkIGFzICdSb3RhdGUnICovCi0JCWNhc2UgMHgxMDI4OiBtYXBfa2V5X2NsZWFyKEtFWV9BTkdMRSk7CQlicmVhazsKLQkJY2FzZSAweDEwMjk6IG1hcF9rZXlfY2xlYXIoS0VZX1NIVUZGTEUpOwlicmVhazsKLQkJY2FzZSAweDEwMmE6IG1hcF9rZXlfY2xlYXIoS0VZX0JBQ0spOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDJiOiBtYXBfa2V5X2NsZWFyKEtFWV9DWUNMRVdJTkRPV1MpOwlicmVhazsKLQkJY2FzZSAweDEwNDE6IG1hcF9rZXlfY2xlYXIoS0VZX0JBVFRFUlkpOwlicmVhazsKLQkJY2FzZSAweDEwNDI6IG1hcF9rZXlfY2xlYXIoS0VZX1dPUkRQUk9DRVNTT1IpOwlicmVhazsKLQkJY2FzZSAweDEwNDM6IG1hcF9rZXlfY2xlYXIoS0VZX1NQUkVBRFNIRUVUKTsJYnJlYWs7Ci0JCWNhc2UgMHgxMDQ0OiBtYXBfa2V5X2NsZWFyKEtFWV9QUkVTRU5UQVRJT04pOwlicmVhazsKLQkJY2FzZSAweDEwNDU6IG1hcF9rZXlfY2xlYXIoS0VZX1VORE8pOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDQ2OiBtYXBfa2V5X2NsZWFyKEtFWV9SRURPKTsJCWJyZWFrOwotCQljYXNlIDB4MTA0NzogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDQ4OiBtYXBfa2V5X2NsZWFyKEtFWV9TQVZFKTsJCWJyZWFrOwotCQljYXNlIDB4MTA0OTogbWFwX2tleV9jbGVhcihLRVlfUFJPRzEpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDRhOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMik7CQlicmVhazsKLQkJY2FzZSAweDEwNGI6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOwotCQljYXNlIDB4MTA0YzogbWFwX2tleV9jbGVhcihLRVlfUFJPRzQpOwkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19jaGVycnlfZ2VuaXVzXzI5ZShzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4MTU2OiBtYXBfa2V5X2NsZWFyKEtFWV9XT1JEUFJPQ0VTU09SKTsJYnJlYWs7Ci0JCWNhc2UgMHgxNTc6IG1hcF9rZXlfY2xlYXIoS0VZX1NQUkVBRFNIRUVUKTsJYnJlYWs7Ci0JCWNhc2UgMHgxNTg6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVNFTlRBVElPTik7CWJyZWFrOwotCQljYXNlIDB4MTVjOiBtYXBfa2V5X2NsZWFyKEtFWV9TVE9QKTsJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcXVpcmtfYnRjXzgxOTMoc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJY2FzZSAweDIzMDogbWFwX2tleShCVE5fTU9VU0UpOwkJCWJyZWFrOwotCQljYXNlIDB4MjMxOiBtYXBfcmVsKFJFTF9XSEVFTCk7CQkJYnJlYWs7Ci0JCS8qIAotCQkgKiB0aGlzIGtleWJvYXJkIGhhcyBhIHNjcm9sbHdoZWVsIGltcGxlbWVudGVkIGluCi0JCSAqIHRvdGFsbHkgYnJva2VuIHdheS4gV2UgbWFwIHRoaXMgdXNhZ2UgdGVtcG9yYXJpbHkKLQkJICogdG8gSFdIRUVMIGFuZCBoYW5kbGUgaXQgaW4gdGhlIGV2ZW50IHF1aXJrIGhhbmRsZXIKLQkJICovCi0JCWNhc2UgMHgyMzI6IG1hcF9yZWwoUkVMX0hXSEVFTCk7CQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHF1aXJrX3N1bnBsdXNfd2Rlc2t0b3Aoc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJY2FzZSAweDIwMDM6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01JTik7CQlicmVhazsKLQkJY2FzZSAweDIxMDM6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01PVVQpOwlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotI2RlZmluZSBWRU5ET1JfSURfQkVMS0lOCQkJMHgxMDIwCi0jZGVmaW5lIERFVklDRV9JRF9CRUxLSU5fV0lSRUxFU1NfS0VZQk9BUkQJMHgwMDA2Ci0KLSNkZWZpbmUgVkVORE9SX0lEX0NIRVJSWQkJCTB4MDQ2YQotI2RlZmluZSBERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OCQkweDAwMjMKLQotI2RlZmluZSBWRU5ET1JfSURfQ0hJQ09OWQkJCTB4MDRmMgotI2RlZmluZSBERVZJQ0VfSURfQ0hJQ09OWV9UQUNUSUNBTF9QQUQJCTB4MDQxOAotCi0jZGVmaW5lIFZFTkRPUl9JRF9FWktFWQkJCQkweDA1MTgKLSNkZWZpbmUgREVWSUNFX0lEX0JUQ184MTkzCQkJMHgwMDAyCi0KLSNkZWZpbmUgVkVORE9SX0lEX0dZUkFUSU9OCQkJMHgwYzE2Ci0jZGVmaW5lIERFVklDRV9JRF9HWVJBVElPTl9SRU1PVEUJCTB4MDAwMgotCi0jZGVmaW5lIFZFTkRPUl9JRF9MT0dJVEVDSAkJCTB4MDQ2ZAotI2RlZmluZSBERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIJCTB4YzEwMQotI2RlZmluZSBERVZJQ0VfSURfUzUxMF9SRUNFSVZFUgkJCTB4YzUwYwotI2RlZmluZSBERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yCQkweGM1MTcKLSNkZWZpbmUgREVWSUNFX0lEX01YMzAwMF9SRUNFSVZFUgkJMHhjNTEzCi0KLSNkZWZpbmUgVkVORE9SX0lEX01JQ1JPU09GVAkJCTB4MDQ1ZQotI2RlZmluZSBERVZJQ0VfSURfTVM0SwkJCQkweDAwZGIKLSNkZWZpbmUgREVWSUNFX0lEX01TNksJCQkJMHgwMGY5Ci0jZGVmaW5lIERFVklDRV9JU19NU19QUkVTRU5URVJfOEtfQlQJCTB4MDcwMQotI2RlZmluZSBERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX1VTQgkJMHgwNzEzCi0KLSNkZWZpbmUgVkVORE9SX0lEX01PTlRFUkVZCQkJMHgwNTY2Ci0jZGVmaW5lIERFVklDRV9JRF9HRU5JVVNfS0IyOUUJCQkweDMwMDQKLQotI2RlZmluZSBWRU5ET1JfSURfUEVUQUxZTlgJCQkweDE4YjEKLSNkZWZpbmUgREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUJMHgwMDM3Ci0KLSNkZWZpbmUgVkVORE9SX0lEX1NVTlBMVVMJCQkweDA0ZmMKLSNkZWZpbmUgREVWSUNFX0lEX1NVTlBMVVNfV0RFU0tUT1AJCTB4MDVkOAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9pbnB1dF9ibGFja2xpc3QgewotCV9fdTE2IGlkVmVuZG9yOwotCV9fdTE2IGlkUHJvZHVjdDsKLQlpbnQgKCpxdWlyaykoc3RydWN0IGhpZF91c2FnZSAqLCBzdHJ1Y3QgaW5wdXRfZGV2ICosIHVuc2lnbmVkIGxvbmcgKiosIGludCAqKTsKLX0gaGlkX2lucHV0X2JsYWNrbGlzdFtdID0gewotCXsgVkVORE9SX0lEX0JFTEtJTiwgREVWSUNFX0lEX0JFTEtJTl9XSVJFTEVTU19LRVlCT0FSRCwgcXVpcmtfYmVsa2luX3drYmQgfSwKLQotCXsgVkVORE9SX0lEX0NIRVJSWSwgREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTiwgcXVpcmtfY2hlcnJ5X2N5bW90aW9uIH0sCi0KLQl7IFZFTkRPUl9JRF9DSElDT05ZLCBERVZJQ0VfSURfQ0hJQ09OWV9UQUNUSUNBTF9QQUQsIHF1aXJrX2NoaWNvbnlfdGFjdGljYWxfcGFkIH0sCi0KLQl7IFZFTkRPUl9JRF9FWktFWSwgREVWSUNFX0lEX0JUQ184MTkzLCBxdWlya19idGNfODE5MyB9LAotCi0JeyBWRU5ET1JfSURfR1lSQVRJT04sIERFVklDRV9JRF9HWVJBVElPTl9SRU1PVEUsIHF1aXJrX2d5cmF0aW9uX3JlbW90ZSB9LAotCi0JeyBWRU5ET1JfSURfTE9HSVRFQ0gsIERFVklDRV9JRF9MT0dJVEVDSF9SRUNFSVZFUiwgcXVpcmtfbG9naXRlY2hfdWx0cmF4X3JlbW90ZSB9LAotCXsgVkVORE9SX0lEX0xPR0lURUNILCBERVZJQ0VfSURfUzUxMF9SRUNFSVZFUiwgcXVpcmtfbG9naXRlY2hfd2lyZWxlc3MgfSwKLQl7IFZFTkRPUl9JRF9MT0dJVEVDSCwgREVWSUNFX0lEX1M1MTBfUkVDRUlWRVJfMiwgcXVpcmtfbG9naXRlY2hfd2lyZWxlc3MgfSwKLQl7IFZFTkRPUl9JRF9MT0dJVEVDSCwgREVWSUNFX0lEX01YMzAwMF9SRUNFSVZFUiwgcXVpcmtfbG9naXRlY2hfd2lyZWxlc3MgfSwKLQotCXsgVkVORE9SX0lEX01JQ1JPU09GVCwgREVWSUNFX0lEX01TNEssIHF1aXJrX21pY3Jvc29mdF9lcmdvbm9teV9rYiB9LAotCXsgVkVORE9SX0lEX01JQ1JPU09GVCwgREVWSUNFX0lEX01TNkssIHF1aXJrX21pY3Jvc29mdF9lcmdvbm9teV9rYiB9LAotCXsgVkVORE9SX0lEX01JQ1JPU09GVCwgREVWSUNFX0lTX01TX1BSRVNFTlRFUl84S19CVCwgcXVpcmtfbWljcm9zb2Z0X3ByZXNlbnRlcl84ayB9LAotCXsgVkVORE9SX0lEX01JQ1JPU09GVCwgREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19VU0IsIHF1aXJrX21pY3Jvc29mdF9wcmVzZW50ZXJfOGsgfSwKLQotCXsgVkVORE9SX0lEX01PTlRFUkVZLCBERVZJQ0VfSURfR0VOSVVTX0tCMjlFLCBxdWlya19jaGVycnlfZ2VuaXVzXzI5ZSB9LAotCi0JeyBWRU5ET1JfSURfUEVUQUxZTlgsIERFVklDRV9JRF9QRVRBTFlOWF9NQVhURVJfUkVNT1RFLCBxdWlya19wZXRhbHlueF9yZW1vdGUgfSwKLQotCXsgVkVORE9SX0lEX1NVTlBMVVMsIERFVklDRV9JRF9TVU5QTFVTX1dERVNLVE9QLCBxdWlya19zdW5wbHVzX3dkZXNrdG9wIH0sCi0KLQl7IDAsIDAsIE5VTEwgfQotfTsKLQotaW50IGhpZGlucHV0X21hcHBpbmdfcXVpcmtzKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCAKLQkJCQkgICBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwgCi0JCQkJICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmRldmljZSA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0KTsKLQlpbnQgaSA9IDA7Ci0JCi0Jd2hpbGUgKGhpZF9pbnB1dF9ibGFja2xpc3RbaV0ucXVpcmspIHsKLQkJaWYgKGhpZF9pbnB1dF9ibGFja2xpc3RbaV0uaWRWZW5kb3IgPT0gZGV2aWNlLT52ZW5kb3IgJiYKLQkJCQloaWRfaW5wdXRfYmxhY2tsaXN0W2ldLmlkUHJvZHVjdCA9PSBkZXZpY2UtPnByb2R1Y3QpCi0JCQlyZXR1cm4gaGlkX2lucHV0X2JsYWNrbGlzdFtpXS5xdWlyayh1c2FnZSwgaW5wdXQsIGJpdCwgbWF4KTsKLQkJaSsrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGhpZGlucHV0X2V2ZW50X3F1aXJrcyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwotCi0JaW5wdXQgPSBmaWVsZC0+aGlkaW5wdXQtPmlucHV0OwotCi0JaWYgKCgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNSkgJiYgKHVzYWdlLT5oaWQgPT0gMHgwMDA5MDAwNSkpCi0JCXx8ICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNykgJiYgKHVzYWdlLT5oaWQgPT0gMHgwMDA5MDAwNykpKSB7Ci0JCWlmICh2YWx1ZSkgaGlkLT5xdWlya3MgfD0gIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19PTjsKLQkJZWxzZSAgICAgICBoaWQtPnF1aXJrcyAmPSB+SElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX0I4KSAmJgotCQkJKHVzYWdlLT50eXBlID09IEVWX1JFTCkgJiYKLQkJCSh1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwpKSB7Ci0JCWhpZC0+ZGVsYXllZF92YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX0I4KSAmJgotCQkJKHVzYWdlLT5oaWQgPT0gMHgwMDAxMDBiOCkpIHsKLQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX1JFTCwgdmFsdWUgPyBSRUxfSFdIRUVMIDogUkVMX1dIRUVMLCBoaWQtPmRlbGF5ZWRfdmFsdWUpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0lOVkVSVF9IV0hFRUwpICYmICh1c2FnZS0+Y29kZSA9PSBSRUxfSFdIRUVMKSkgewotCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCAtdmFsdWUpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OKSAmJiAodXNhZ2UtPmNvZGUgPT0gUkVMX1dIRUVMKSkgewotCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIFJFTF9IV0hFRUwsIHZhbHVlKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19BUFBMRV9IQVNfRk4pICYmIGhpZGlucHV0X2FwcGxlX2V2ZW50KGhpZCwgaW5wdXQsIHVzYWdlLCB2YWx1ZSkpCi0JCXJldHVybiAxOwotCi0JLyogSGFuZGxpbmcgTVMga2V5Ym9hcmRzIHNwZWNpYWwgYnV0dG9ucyAqLwotCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19NSUNST1NPRlRfS0VZUyAmJiAKLQkJCXVzYWdlLT5oaWQgPT0gKEhJRF9VUF9NU1ZFTkRPUiB8IDB4ZmYwNSkpIHsKLQkJaW50IGtleSA9IDA7Ci0JCXN0YXRpYyBpbnQgbGFzdF9rZXkgPSAwOwotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIDB4MDE6IGtleSA9IEtFWV9GMTQ7IGJyZWFrOwotCQkJY2FzZSAweDAyOiBrZXkgPSBLRVlfRjE1OyBicmVhazsKLQkJCWNhc2UgMHgwNDoga2V5ID0gS0VZX0YxNjsgYnJlYWs7Ci0JCQljYXNlIDB4MDg6IGtleSA9IEtFWV9GMTc7IGJyZWFrOwotCQkJY2FzZSAweDEwOiBrZXkgPSBLRVlfRjE4OyBicmVhazsKLQkJCWRlZmF1bHQ6IGJyZWFrOwotCQl9Ci0JCWlmIChrZXkpIHsKLQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwga2V5LCAxKTsKLQkJCWxhc3Rfa2V5ID0ga2V5OwotCQl9IGVsc2UgewotCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCBsYXN0X2tleSwgMCk7Ci0JCX0KLQl9Ci0KLQkvKiBoYW5kbGUgdGhlIHRlbXBvcmFyeSBxdWlya3kgbWFwcGluZyB0byBIV0hFRUwgKi8KLQlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfSFdIRUVMX1dIRUVMX0lOVkVSVCAmJgotCQkJdXNhZ2UtPnR5cGUgPT0gRVZfUkVMICYmIHVzYWdlLT5jb2RlID09IFJFTF9IV0hFRUwpIHsKLQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCBSRUxfV0hFRUwsIC12YWx1ZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIEd5cmF0aW9uIE1DRSByZW1vdGUgIlNsZWVwIiBrZXkgKi8KLQlpZiAoaGlkLT52ZW5kb3IgPT0gVkVORE9SX0lEX0dZUkFUSU9OICYmCi0JICAgIGhpZC0+cHJvZHVjdCA9PSBERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFICYmCi0JICAgICh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpID09IEhJRF9VUF9HRU5ERVNLICYmCi0JICAgICh1c2FnZS0+aGlkICYgMHhmZikgPT0gMHg4MikgewotCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCAxKTsKLQkJaW5wdXRfc3luYyhpbnB1dCk7Ci0JCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIDApOwotCQlpbnB1dF9zeW5jKGlucHV0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKaW5kZXggMWIyZThkYy4uN2YxODNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKQEAgLTMyLDExICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLWRlYnVnLmg+CiAKLXN0YXRpYyBpbnQgaGlkX2FwcGxlX2ZubW9kZSA9IDE7Ci1tb2R1bGVfcGFyYW1fbmFtZWQocGJfZm5tb2RlLCBoaWRfYXBwbGVfZm5tb2RlLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhwYl9mbm1vZGUsCi0JCSJNb2RlIG9mIGZuIGtleSBvbiBBcHBsZSBrZXlib2FyZHMgKDAgPSBkaXNhYmxlZCwgMSA9IGZrZXlzbGFzdCwgMiA9IGZrZXlzZmlyc3QpIik7Ci0KICNkZWZpbmUgdW5rCUtFWV9VTktOT1dOCiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGhpZF9rZXlib2FyZFsyNTZdID0gewpAQCAtNTgsMjI3ICs1MywyMCBAQAogCTE1MCwxNTgsMTU5LDEyOCwxMzYsMTc3LDE3OCwxNzYsMTQyLDE1MiwxNzMsMTQwLHVuayx1bmssdW5rLHVuawogfTsKIAotLyogZXh0ZW5kZWQgbWFwcGluZyBmb3IgY2VydGFpbiBMb2dpdGVjaCBoYXJkd2FyZSAoTG9naXRlY2ggY29yZGxlc3MgZGVza3RvcCBMWDUwMCkgKi8KLSNkZWZpbmUgTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQX1NJWkUgODAKLXN0YXRpYyBpbnQgbG9naXRlY2hfZXhwYW5kZWRfa2V5bWFwW0xPR0lURUNIX0VYUEFOREVEX0tFWU1BUF9TSVpFXSA9IHsKLQkgIDAsMjE2LCAgMCwyMTMsMTc1LDE1NiwgIDAsICAwLCAgMCwgIDAsCi0JMTQ0LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsMjEyLAotCTE3NCwxNjcsMTUyLDE2MSwxMTIsICAwLCAgMCwgIDAsMTU0LCAgMCwKLQkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkgIDAsICAwLCAgMCwgIDAsICAwLDE4MywxODQsMTg1LDE4NiwxODcsCi0JMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LCAgMCwgIDAsICAwCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlfX3MzMiB4OwogCV9fczMyIHk7CiB9ICBoaWRfaGF0X3RvX2F4aXNbXSA9IHt7IDAsIDB9LCB7IDAsLTF9LCB7IDEsLTF9LCB7IDEsIDB9LCB7IDEsIDF9LCB7IDAsIDF9LCB7LTEsIDF9LCB7LTEsIDB9LCB7LTEsLTF9fTsKIAotI2RlZmluZSBtYXBfYWJzKGMpCWRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX0FCUzsgYml0ID0gaW5wdXQtPmFic2JpdDsgbWF4ID0gQUJTX01BWDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbWFwX3JlbChjKQlkbyB7IHVzYWdlLT5jb2RlID0gYzsgdXNhZ2UtPnR5cGUgPSBFVl9SRUw7IGJpdCA9IGlucHV0LT5yZWxiaXQ7IG1heCA9IFJFTF9NQVg7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1hcF9rZXkoYykJZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfS0VZOyBiaXQgPSBpbnB1dC0+a2V5Yml0OyBtYXggPSBLRVlfTUFYOyB9IHdoaWxlICgwKQotI2RlZmluZSBtYXBfbGVkKGMpCWRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX0xFRDsgYml0ID0gaW5wdXQtPmxlZGJpdDsgbWF4ID0gTEVEX01BWDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbWFwX2FicyhjKQloaWRfbWFwX3VzYWdlKGhpZGlucHV0LCB1c2FnZSwgJmJpdCwgJm1heCwgRVZfQUJTLCAoYykpCisjZGVmaW5lIG1hcF9yZWwoYykJaGlkX21hcF91c2FnZShoaWRpbnB1dCwgdXNhZ2UsICZiaXQsICZtYXgsIEVWX1JFTCwgKGMpKQorI2RlZmluZSBtYXBfa2V5KGMpCWhpZF9tYXBfdXNhZ2UoaGlkaW5wdXQsIHVzYWdlLCAmYml0LCAmbWF4LCBFVl9LRVksIChjKSkKKyNkZWZpbmUgbWFwX2xlZChjKQloaWRfbWFwX3VzYWdlKGhpZGlucHV0LCB1c2FnZSwgJmJpdCwgJm1heCwgRVZfTEVELCAoYykpCiAKLSNkZWZpbmUgbWFwX2Fic19jbGVhcihjKQlkbyB7IG1hcF9hYnMoYyk7IGNsZWFyX2JpdChjLCBiaXQpOyB9IHdoaWxlICgwKQotI2RlZmluZSBtYXBfa2V5X2NsZWFyKGMpCWRvIHsgbWFwX2tleShjKTsgY2xlYXJfYml0KGMsIGJpdCk7IH0gd2hpbGUgKDApCi0KLSNpZmRlZiBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSwotCi1zdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIHsKLQl1MTYgZnJvbTsKLQl1MTYgdG87Ci0JdTggZmxhZ3M7Ci19OwotCi0jZGVmaW5lIEFQUExFX0ZMQUdfRktFWSAweDAxCi0KLXN0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIGFwcGxlX2ZuX2tleXNbXSA9IHsKLQl7IEtFWV9CQUNLU1BBQ0UsIEtFWV9ERUxFVEUgfSwKLQl7IEtFWV9GMSwgICAgICAgS0VZX0JSSUdIVE5FU1NET1dOLCBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GMiwgICAgICAgS0VZX0JSSUdIVE5FU1NVUCwgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GMywgICAgICAgS0VZX0ZOX0Y1LCAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwgLyogRXhwb3PpICovCi0JeyBLRVlfRjQsICAgICAgIEtFWV9GTl9GNCwgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sIC8qIERhc2hib2FyZCAqLwotCXsgS0VZX0Y1LCAgICAgICBLRVlfS0JESUxMVU1ET1dOLCAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y2LCAgICAgICBLRVlfS0JESUxMVU1VUCwgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y3LCAgICAgICBLRVlfUFJFVklPVVNTT05HLCAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y4LCAgICAgICBLRVlfUExBWVBBVVNFLCAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y5LCAgICAgICBLRVlfTkVYVFNPTkcsICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YxMCwgICAgICBLRVlfTVVURSwgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YxMSwgICAgICBLRVlfVk9MVU1FRE9XTiwgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YxMiwgICAgICBLRVlfVk9MVU1FVVAsICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX1VQLCAgICAgICBLRVlfUEFHRVVQIH0sCi0JeyBLRVlfRE9XTiwgICAgIEtFWV9QQUdFRE9XTiB9LAotCXsgS0VZX0xFRlQsICAgICBLRVlfSE9NRSB9LAotCXsgS0VZX1JJR0hULCAgICBLRVlfRU5EIH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfZm5fa2V5c1tdID0gewotCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0RFTEVURSB9LAotCXsgS0VZX0YxLCAgICAgICBLRVlfQlJJR0hUTkVTU0RPV04sICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GMiwgICAgICAgS0VZX0JSSUdIVE5FU1NVUCwgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjMsICAgICAgIEtFWV9NVVRFLCAgICAgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y0LCAgICAgICBLRVlfVk9MVU1FRE9XTiwgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GNSwgICAgICAgS0VZX1ZPTFVNRVVQLCAgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjYsICAgICAgIEtFWV9OVU1MT0NLLCAgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y3LCAgICAgICBLRVlfU1dJVENIVklERU9NT0RFLCAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GOCwgICAgICAgS0VZX0tCRElMTFVNVE9HR0xFLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjksICAgICAgIEtFWV9LQkRJTExVTURPV04sICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YxMCwgICAgICBLRVlfS0JESUxMVU1VUCwgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9VUCwgICAgICAgS0VZX1BBR0VVUCB9LAotCXsgS0VZX0RPV04sICAgICBLRVlfUEFHRURPV04gfSwKLQl7IEtFWV9MRUZULCAgICAgS0VZX0hPTUUgfSwKLQl7IEtFWV9SSUdIVCwgICAgS0VZX0VORCB9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gcG93ZXJib29rX251bWxvY2tfa2V5c1tdID0gewotCXsgS0VZX0osICAgICAgICBLRVlfS1AxIH0sCi0JeyBLRVlfSywgICAgICAgIEtFWV9LUDIgfSwKLQl7IEtFWV9MLCAgICAgICAgS0VZX0tQMyB9LAotCXsgS0VZX1UsICAgICAgICBLRVlfS1A0IH0sCi0JeyBLRVlfSSwgICAgICAgIEtFWV9LUDUgfSwKLQl7IEtFWV9PLCAgICAgICAgS0VZX0tQNiB9LAotCXsgS0VZXzcsICAgICAgICBLRVlfS1A3IH0sCi0JeyBLRVlfOCwgICAgICAgIEtFWV9LUDggfSwKLQl7IEtFWV85LCAgICAgICAgS0VZX0tQOSB9LAotCXsgS0VZX00sICAgICAgICBLRVlfS1AwIH0sCi0JeyBLRVlfRE9ULCAgICAgIEtFWV9LUERPVCB9LAotCXsgS0VZX1NMQVNILCAgICBLRVlfS1BQTFVTIH0sCi0JeyBLRVlfU0VNSUNPTE9OLCBLRVlfS1BNSU5VUyB9LAotCXsgS0VZX1AsICAgICAgICBLRVlfS1BBU1RFUklTSyB9LAotCXsgS0VZX01JTlVTLCAgICBLRVlfS1BFUVVBTCB9LAotCXsgS0VZXzAsICAgICAgICBLRVlfS1BTTEFTSCB9LAotCXsgS0VZX0Y2LCAgICAgICBLRVlfTlVNTE9DSyB9LAotCXsgS0VZX0tQRU5URVIsICBLRVlfS1BFTlRFUiB9LAotCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0JBQ0tTUEFDRSB9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gYXBwbGVfaXNvX2tleWJvYXJkW10gPSB7Ci0JeyBLRVlfR1JBVkUsICAgIEtFWV8xMDJORCB9LAotCXsgS0VZXzEwMk5ELCAgICBLRVlfR1JBVkUgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICpmaW5kX3RyYW5zbGF0aW9uKHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRhYmxlLCB1MTYgZnJvbSkKLXsKLQlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKLQotCS8qIExvb2sgZm9yIHRoZSB0cmFuc2xhdGlvbiAqLwotCWZvciAodHJhbnMgPSB0YWJsZTsgdHJhbnMtPmZyb207IHRyYW5zKyspCi0JCWlmICh0cmFucy0+ZnJvbSA9PSBmcm9tKQotCQkJcmV0dXJuIHRyYW5zOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBoaWRpbnB1dF9hcHBsZV9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQotewotCXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOwotCi0JaWYgKHVzYWdlLT5jb2RlID09IEtFWV9GTikgewotCQlpZiAodmFsdWUpIGhpZC0+cXVpcmtzIHw9ICBISURfUVVJUktfQVBQTEVfRk5fT047Ci0JCWVsc2UgICAgICAgaGlkLT5xdWlya3MgJj0gfkhJRF9RVUlSS19BUFBMRV9GTl9PTjsKLQotCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKGhpZF9hcHBsZV9mbm1vZGUpIHsKLQkJaW50IGRvX3RyYW5zbGF0ZTsKLQotCQl0cmFucyA9IGZpbmRfdHJhbnNsYXRpb24oKGhpZC0+cHJvZHVjdCA8IDB4MjIwIHx8Ci0JCQkJCSAgaGlkLT5wcm9kdWN0ID49IDB4MzAwKSA/Ci0JCQkJCSBwb3dlcmJvb2tfZm5fa2V5cyA6IGFwcGxlX2ZuX2tleXMsCi0JCQkJCSB1c2FnZS0+Y29kZSk7Ci0JCWlmICh0cmFucykgewotCQkJaWYgKHRlc3RfYml0KHVzYWdlLT5jb2RlLCBoaWQtPmFwcGxlX3ByZXNzZWRfZm4pKQotCQkJCWRvX3RyYW5zbGF0ZSA9IDE7Ci0JCQllbHNlIGlmICh0cmFucy0+ZmxhZ3MgJiBBUFBMRV9GTEFHX0ZLRVkpCi0JCQkJZG9fdHJhbnNsYXRlID0KLQkJCQkJKGhpZF9hcHBsZV9mbm1vZGUgPT0gMiAmJiAgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0FQUExFX0ZOX09OKSkgfHwKLQkJCQkJKGhpZF9hcHBsZV9mbm1vZGUgPT0gMSAmJiAhKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0FQUExFX0ZOX09OKSk7Ci0JCQllbHNlCi0JCQkJZG9fdHJhbnNsYXRlID0gKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0FQUExFX0ZOX09OKTsKLQotCQkJaWYgKGRvX3RyYW5zbGF0ZSkgewotCQkJCWlmICh2YWx1ZSkKLQkJCQkJc2V0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5hcHBsZV9wcmVzc2VkX2ZuKTsKLQkJCQllbHNlCi0JCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5hcHBsZV9wcmVzc2VkX2ZuKTsKLQotCQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7Ci0KLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiAmJiAoCi0JCQkJdGVzdF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKSB8fAotCQkJCXRlc3RfYml0KExFRF9OVU1MLCBpbnB1dC0+bGVkKSkpIHsKLQkJCXRyYW5zID0gZmluZF90cmFuc2xhdGlvbihwb3dlcmJvb2tfbnVtbG9ja19rZXlzLCB1c2FnZS0+Y29kZSk7Ci0KLQkJCWlmICh0cmFucykgewotCQkJCWlmICh2YWx1ZSkKLQkJCQkJc2V0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spOwotCQkJCWVsc2UKLQkJCQkJY2xlYXJfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfbnVtbG9jayk7Ci0KLQkJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHRyYW5zLT50bywgdmFsdWUpOwotCQkJfQotCi0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkQpIHsKLQkJdHJhbnMgPSBmaW5kX3RyYW5zbGF0aW9uKGFwcGxlX2lzb19rZXlib2FyZCwgdXNhZ2UtPmNvZGUpOwotCQlpZiAodHJhbnMpIHsKLQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBoaWRpbnB1dF9hcHBsZV9zZXR1cChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKLXsKLQlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKLQotCXNldF9iaXQoS0VZX05VTUxPQ0ssIGlucHV0LT5rZXliaXQpOwotCi0JLyogRW5hYmxlIGFsbCBuZWVkZWQga2V5cyAqLwotCWZvciAodHJhbnMgPSBhcHBsZV9mbl9rZXlzOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKLQkJc2V0X2JpdCh0cmFucy0+dG8sIGlucHV0LT5rZXliaXQpOwotCi0JZm9yICh0cmFucyA9IHBvd2VyYm9va19mbl9rZXlzOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKLQkJc2V0X2JpdCh0cmFucy0+dG8sIGlucHV0LT5rZXliaXQpOwotCi0JZm9yICh0cmFucyA9IHBvd2VyYm9va19udW1sb2NrX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQotCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7Ci0KLQlmb3IgKHRyYW5zID0gYXBwbGVfaXNvX2tleWJvYXJkOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKLQkJc2V0X2JpdCh0cmFucy0+dG8sIGlucHV0LT5rZXliaXQpOwotCi19Ci0jZWxzZQotaW5saW5lIGludCBoaWRpbnB1dF9hcHBsZV9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLAotCQkJCSAgICAgICBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCQkgICAgICAgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGlkaW5wdXRfYXBwbGVfc2V0dXAoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCi17Ci19Ci0jZW5kaWYKKyNkZWZpbmUgbWFwX2Fic19jbGVhcihjKQloaWRfbWFwX3VzYWdlX2NsZWFyKGhpZGlucHV0LCB1c2FnZSwgJmJpdCwgXAorCQkmbWF4LCBFVl9BQlMsIChjKSkKKyNkZWZpbmUgbWFwX2tleV9jbGVhcihjKQloaWRfbWFwX3VzYWdlX2NsZWFyKGhpZGlucHV0LCB1c2FnZSwgJmJpdCwgXAorCQkmbWF4LCBFVl9LRVksIChjKSkKIAogc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfc2NhbmNvZGUoaW50IGNvZGUsIGludCBzY2FuY29kZSkKIHsKQEAgLTM2Niw3ICsxNTQsNyBAQAogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gaGlkaW5wdXQtPmlucHV0OwogCXN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dCk7Ci0JaW50IG1heCA9IDAsIGNvZGUsIHJldDsKKwlpbnQgbWF4ID0gMCwgY29kZTsKIAl1bnNpZ25lZCBsb25nICpiaXQgPSBOVUxMOwogCiAJZmllbGQtPmhpZGlucHV0ID0gaGlkaW5wdXQ7CkBAIC0zODUsNDA2ICsxNzMsMzQ1IEBACiAJCWdvdG8gaWdub3JlOwogCX0KIAotCS8qIGhhbmRsZSBpbnB1dCBtYXBwaW5ncyBmb3IgcXVpcmt5IGRldmljZXMgKi8KLQlyZXQgPSBoaWRpbnB1dF9tYXBwaW5nX3F1aXJrcyh1c2FnZSwgaW5wdXQsICZiaXQsICZtYXgpOwotCWlmIChyZXQpCi0JCWdvdG8gbWFwcGVkOworCWlmIChkZXZpY2UtPmRyaXZlci0+aW5wdXRfbWFwcGluZykgeworCQlpbnQgcmV0ID0gZGV2aWNlLT5kcml2ZXItPmlucHV0X21hcHBpbmcoZGV2aWNlLCBoaWRpbnB1dCwgZmllbGQsCisJCQkJdXNhZ2UsICZiaXQsICZtYXgpOworCQlpZiAocmV0ID4gMCkKKwkJCWdvdG8gbWFwcGVkOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gaWdub3JlOworCX0KIAogCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSB7CisJY2FzZSBISURfVVBfVU5ERUZJTkVEOgorCQlnb3RvIGlnbm9yZTsKIAotCQljYXNlIEhJRF9VUF9VTkRFRklORUQ6Ci0JCQlnb3RvIGlnbm9yZTsKKwljYXNlIEhJRF9VUF9LRVlCT0FSRDoKKwkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CiAKLQkJY2FzZSBISURfVVBfS0VZQk9BUkQ6CisJCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgPCAyNTYpIHsKKwkJCWlmICghaGlkX2tleWJvYXJkW3VzYWdlLT5oaWQgJiBISURfVVNBR0VdKSBnb3RvIGlnbm9yZTsKKwkJCW1hcF9rZXlfY2xlYXIoaGlkX2tleWJvYXJkW3VzYWdlLT5oaWQgJiBISURfVVNBR0VdKTsKKwkJfSBlbHNlCisJCQltYXBfa2V5KEtFWV9VTktOT1dOKTsKIAotCQkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CisJCWJyZWFrOwogCi0JCQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIDwgMjU2KSB7Ci0JCQkJaWYgKCFoaWRfa2V5Ym9hcmRbdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV0pIGdvdG8gaWdub3JlOwotCQkJCW1hcF9rZXlfY2xlYXIoaGlkX2tleWJvYXJkW3VzYWdlLT5oaWQgJiBISURfVVNBR0VdKTsKLQkJCX0gZWxzZQotCQkJCW1hcF9rZXkoS0VZX1VOS05PV04pOworCWNhc2UgSElEX1VQX0JVVFRPTjoKKwkJY29kZSA9ICgodXNhZ2UtPmhpZCAtIDEpICYgMHhmKTsKIAotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfQlVUVE9OOgotCi0JCQljb2RlID0gKCh1c2FnZS0+aGlkIC0gMSkgJiAweGYpOwotCi0JCQlzd2l0Y2ggKGZpZWxkLT5hcHBsaWNhdGlvbikgewotCQkJCWNhc2UgSElEX0dEX01PVVNFOgotCQkJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IDB4MTEwOyBicmVhazsKLQkJCQljYXNlIEhJRF9HRF9KT1lTVElDSzogY29kZSArPSAweDEyMDsgYnJlYWs7Ci0JCQkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gMHgxMzA7IGJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXN3aXRjaCAoZmllbGQtPnBoeXNpY2FsKSB7Ci0JCQkJCQljYXNlIEhJRF9HRF9NT1VTRToKLQkJCQkJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IDB4MTEwOyBicmVhazsKLQkJCQkJCWNhc2UgSElEX0dEX0pPWVNUSUNLOiBjb2RlICs9IDB4MTIwOyBicmVhazsKLQkJCQkJCWNhc2UgSElEX0dEX0dBTUVQQUQ6ICBjb2RlICs9IDB4MTMwOyBicmVhazsKLQkJCQkJCWRlZmF1bHQ6ICAgICAgICAgICAgICBjb2RlICs9IDB4MTAwOwotCQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIExvZ2l0ZWNoIENvcmRsZXNzIERlc2t0b3AgKi8KLQkJCWlmIChmaWVsZC0+YXBwbGljYXRpb24gIT0gSElEX0dEX01PVVNFKSB7Ci0JCQkJaWYgKGRldmljZS0+cXVpcmtzICYgSElEX1FVSVJLX0xPR0lURUNIX0VYUEFOREVEX0tFWU1BUCkgewotCQkJCQlpbnQgaGlkID0gdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRTsKLQkJCQkJaWYgKGhpZCA8IExPR0lURUNIX0VYUEFOREVEX0tFWU1BUF9TSVpFICYmIGxvZ2l0ZWNoX2V4cGFuZGVkX2tleW1hcFtoaWRdICE9IDApCi0JCQkJCQljb2RlID0gbG9naXRlY2hfZXhwYW5kZWRfa2V5bWFwW2hpZF07Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZGV2aWNlLT5xdWlya3MgJiBISURfUVVJUktfTE9HSVRFQ0hfSUdOT1JFX0RPVUJMRURfV0hFRUwpIHsKLQkJCQkJaW50IGhpZCA9IHVzYWdlLT5oaWQgJiBISURfVVNBR0U7Ci0JCQkJCWlmIChoaWQgPT0gNyB8fCBoaWQgPT0gOCkKLQkJCQkJCWdvdG8gaWdub3JlOwotCQkJCX0KLQkJCX0KLQotCQkJbWFwX2tleShjb2RlKTsKLQkJCWJyZWFrOwotCi0KLQkJY2FzZSBISURfVVBfU0lNVUxBVElPTjoKLQotCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmZmZmKSB7Ci0JCQkJY2FzZSAweGJhOiBtYXBfYWJzKEFCU19SVURERVIpOyAgIGJyZWFrOwotCQkJCWNhc2UgMHhiYjogbWFwX2FicyhBQlNfVEhST1RUTEUpOyBicmVhazsKLQkJCQljYXNlIDB4YzQ6IG1hcF9hYnMoQUJTX0dBUyk7ICAgICAgYnJlYWs7Ci0JCQkJY2FzZSAweGM1OiBtYXBfYWJzKEFCU19CUkFLRSk7ICAgIGJyZWFrOwotCQkJCWNhc2UgMHhjODogbWFwX2FicyhBQlNfV0hFRUwpOyAgICBicmVhazsKLQkJCQlkZWZhdWx0OiAgIGdvdG8gaWdub3JlOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfR0VOREVTSzoKLQotCQkJaWYgKCh1c2FnZS0+aGlkICYgMHhmMCkgPT0gMHg4MCkgewkvKiBTeXN0ZW1Db250cm9sICovCi0JCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmKSB7Ci0JCQkJCWNhc2UgMHgxOiBtYXBfa2V5X2NsZWFyKEtFWV9QT1dFUik7ICBicmVhazsKLQkJCQkJY2FzZSAweDI6IG1hcF9rZXlfY2xlYXIoS0VZX1NMRUVQKTsgIGJyZWFrOwotCQkJCQljYXNlIDB4MzogbWFwX2tleV9jbGVhcihLRVlfV0FLRVVQKTsgYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6IGdvdG8gdW5rbm93bjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICgodXNhZ2UtPmhpZCAmIDB4ZjApID09IDB4OTApIHsJLyogRC1wYWQgKi8KLQkJCQlzd2l0Y2ggKHVzYWdlLT5oaWQpIHsKLQkJCQkJY2FzZSBISURfR0RfVVA6CSAgIHVzYWdlLT5oYXRfZGlyID0gMTsgYnJlYWs7Ci0JCQkJCWNhc2UgSElEX0dEX0RPV046ICB1c2FnZS0+aGF0X2RpciA9IDU7IGJyZWFrOwotCQkJCQljYXNlIEhJRF9HRF9SSUdIVDogdXNhZ2UtPmhhdF9kaXIgPSAzOyBicmVhazsKLQkJCQkJY2FzZSBISURfR0RfTEVGVDogIHVzYWdlLT5oYXRfZGlyID0gNzsgYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6IGdvdG8gdW5rbm93bjsKLQkJCQl9Ci0JCQkJaWYgKGZpZWxkLT5kcGFkKSB7Ci0JCQkJCW1hcF9hYnMoZmllbGQtPmRwYWQpOwotCQkJCQlnb3RvIGlnbm9yZTsKLQkJCQl9Ci0JCQkJbWFwX2FicyhBQlNfSEFUMFgpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlzd2l0Y2ggKHVzYWdlLT5oaWQpIHsKLQotCQkJCS8qIFRoZXNlIHVzYWdlIElEcyBtYXAgZGlyZWN0bHkgdG8gdGhlIHVzYWdlIGNvZGVzLiAqLwotCQkJCWNhc2UgSElEX0dEX1g6IGNhc2UgSElEX0dEX1k6IGNhc2UgSElEX0dEX1o6Ci0JCQkJY2FzZSBISURfR0RfUlg6IGNhc2UgSElEX0dEX1JZOiBjYXNlIEhJRF9HRF9SWjoKLQkJCQljYXNlIEhJRF9HRF9TTElERVI6IGNhc2UgSElEX0dEX0RJQUw6IGNhc2UgSElEX0dEX1dIRUVMOgotCQkJCQlpZiAoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9SRUxBVElWRSkKLQkJCQkJCW1hcF9yZWwodXNhZ2UtPmhpZCAmIDB4Zik7Ci0JCQkJCWVsc2UKLQkJCQkJCW1hcF9hYnModXNhZ2UtPmhpZCAmIDB4Zik7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBISURfR0RfSEFUU1dJVENIOgotCQkJCQl1c2FnZS0+aGF0X21pbiA9IGZpZWxkLT5sb2dpY2FsX21pbmltdW07Ci0JCQkJCXVzYWdlLT5oYXRfbWF4ID0gZmllbGQtPmxvZ2ljYWxfbWF4aW11bTsKLQkJCQkJbWFwX2FicyhBQlNfSEFUMFgpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSElEX0dEX1NUQVJUOgltYXBfa2V5X2NsZWFyKEJUTl9TVEFSVCk7CWJyZWFrOwotCQkJCWNhc2UgSElEX0dEX1NFTEVDVDoJbWFwX2tleV9jbGVhcihCVE5fU0VMRUNUKTsJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OiBnb3RvIHVua25vd247Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX0xFRDoKLQotCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmZmZmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSElELVZhbHVlOiAgICAgICAgICAgICAgICAgICAqLwotCQkJCWNhc2UgMHgwMTogIG1hcF9sZWQgKExFRF9OVU1MKTsgICAgIGJyZWFrOyAgICAvKiAgICJOdW0gTG9jayIgICAgICAgICAgICAgICAgICovCi0JCQkJY2FzZSAweDAyOiAgbWFwX2xlZCAoTEVEX0NBUFNMKTsgICAgYnJlYWs7ICAgIC8qICAgIkNhcHMgTG9jayIgICAgICAgICAgICAgICAgKi8KLQkJCQljYXNlIDB4MDM6ICBtYXBfbGVkIChMRURfU0NST0xMTCk7ICBicmVhazsgICAgLyogICAiU2Nyb2xsIExvY2siICAgICAgICAgICAgICAqLwotCQkJCWNhc2UgMHgwNDogIG1hcF9sZWQgKExFRF9DT01QT1NFKTsgIGJyZWFrOyAgICAvKiAgICJDb21wb3NlIiAgICAgICAgICAgICAgICAgICovCi0JCQkJY2FzZSAweDA1OiAgbWFwX2xlZCAoTEVEX0tBTkEpOyAgICAgYnJlYWs7ICAgIC8qICAgIkthbmEiICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQljYXNlIDB4Mjc6ICBtYXBfbGVkIChMRURfU0xFRVApOyAgICBicmVhazsgICAgLyogICAiU3RhbmQtQnkiICAgICAgICAgICAgICAgICAqLwotCQkJCWNhc2UgMHg0YzogIG1hcF9sZWQgKExFRF9TVVNQRU5EKTsgIGJyZWFrOyAgICAvKiAgICJTeXN0ZW0gU3VzcGVuZCIgICAgICAgICAgICovCi0JCQkJY2FzZSAweDA5OiAgbWFwX2xlZCAoTEVEX01VVEUpOyAgICAgYnJlYWs7ICAgIC8qICAgIk11dGUiICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQljYXNlIDB4NGI6ICBtYXBfbGVkIChMRURfTUlTQyk7ICAgICBicmVhazsgICAgLyogICAiR2VuZXJpYyBJbmRpY2F0b3IiICAgICAgICAqLwotCQkJCWNhc2UgMHgxOTogIG1hcF9sZWQgKExFRF9NQUlMKTsgICAgIGJyZWFrOyAgICAvKiAgICJNZXNzYWdlIFdhaXRpbmciICAgICAgICAgICovCi0JCQkJY2FzZSAweDRkOiAgbWFwX2xlZCAoTEVEX0NIQVJHSU5HKTsgYnJlYWs7ICAgIC8qICAgIkV4dGVybmFsIFBvd2VyIENvbm5lY3RlZCIgKi8KLQotCQkJCWRlZmF1bHQ6IGdvdG8gaWdub3JlOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfRElHSVRJWkVSOgotCi0JCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmKSB7Ci0KLQkJCQljYXNlIDB4MzA6IC8qIFRpcFByZXNzdXJlICovCi0JCQkJCWlmICghdGVzdF9iaXQoQlROX1RPVUNILCBpbnB1dC0+a2V5Yml0KSkgewotCQkJCQkJZGV2aWNlLT5xdWlya3MgfD0gSElEX1FVSVJLX05PVE9VQ0g7Ci0JCQkJCQlzZXRfYml0KEVWX0tFWSwgaW5wdXQtPmV2Yml0KTsKLQkJCQkJCXNldF9iaXQoQlROX1RPVUNILCBpbnB1dC0+a2V5Yml0KTsKLQkJCQkJfQotCi0JCQkJCW1hcF9hYnNfY2xlYXIoQUJTX1BSRVNTVVJFKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4MzI6IC8qIEluUmFuZ2UgKi8KLQkJCQkJc3dpdGNoIChmaWVsZC0+cGh5c2ljYWwgJiAweGZmKSB7Ci0JCQkJCQljYXNlIDB4MjE6IG1hcF9rZXkoQlROX1RPT0xfTU9VU0UpOyBicmVhazsKLQkJCQkJCWNhc2UgMHgyMjogbWFwX2tleShCVE5fVE9PTF9GSU5HRVIpOyBicmVhazsKLQkJCQkJCWRlZmF1bHQ6IG1hcF9rZXkoQlROX1RPT0xfUEVOKTsgYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4M2M6IC8qIEludmVydCAqLwotCQkJCQltYXBfa2V5X2NsZWFyKEJUTl9UT09MX1JVQkJFUik7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAweDMzOiAvKiBUb3VjaCAqLwotCQkJCWNhc2UgMHg0MjogLyogVGlwU3dpdGNoICovCi0JCQkJY2FzZSAweDQzOiAvKiBUaXBTd2l0Y2gyICovCi0JCQkJCWRldmljZS0+cXVpcmtzICY9IH5ISURfUVVJUktfTk9UT1VDSDsKLQkJCQkJbWFwX2tleV9jbGVhcihCVE5fVE9VQ0gpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgMHg0NDogLyogQmFycmVsU3dpdGNoICovCi0JCQkJCW1hcF9rZXlfY2xlYXIoQlROX1NUWUxVUyk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDogIGdvdG8gdW5rbm93bjsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX0NPTlNVTUVSOgkvKiBVU0IgSFVUIHYxLjEsIHBhZ2VzIDU2LTYyICovCi0KLQkJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkJCWNhc2UgMHgwMDA6IGdvdG8gaWdub3JlOwotCQkJCWNhc2UgMHgwMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NMRUVQKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwMzY6IG1hcF9rZXlfY2xlYXIoQlROX01JU0MpOwkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4MDQwOiBtYXBfa2V5X2NsZWFyKEtFWV9NRU5VKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwNDU6IG1hcF9rZXlfY2xlYXIoS0VZX1JBRElPKTsJCWJyZWFrOwotCi0JCQkJY2FzZSAweDA4MzogbWFwX2tleV9jbGVhcihLRVlfTEFTVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDg4OiBtYXBfa2V5X2NsZWFyKEtFWV9QQyk7CQlicmVhazsKLQkJCQljYXNlIDB4MDg5OiBtYXBfa2V5X2NsZWFyKEtFWV9UVik7CQlicmVhazsKLQkJCQljYXNlIDB4MDhhOiBtYXBfa2V5X2NsZWFyKEtFWV9XV1cpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4YjogbWFwX2tleV9jbGVhcihLRVlfRFZEKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1BIT05FKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOGQ6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0dSQU0pOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4ZTogbWFwX2tleV9jbGVhcihLRVlfVklERU9QSE9ORSk7CWJyZWFrOwotCQkJCWNhc2UgMHgwOGY6IG1hcF9rZXlfY2xlYXIoS0VZX0dBTUVTKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOTA6IG1hcF9rZXlfY2xlYXIoS0VZX01FTU8pOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5MTogbWFwX2tleV9jbGVhcihLRVlfQ0QpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5MjogbWFwX2tleV9jbGVhcihLRVlfVkNSKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOTM6IG1hcF9rZXlfY2xlYXIoS0VZX1RVTkVSKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOTQ6IG1hcF9rZXlfY2xlYXIoS0VZX0VYSVQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5NTogbWFwX2tleV9jbGVhcihLRVlfSEVMUCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDk2OiBtYXBfa2V5X2NsZWFyKEtFWV9UQVBFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOTc6IG1hcF9rZXlfY2xlYXIoS0VZX1RWMik7CQlicmVhazsKLQkJCQljYXNlIDB4MDk4OiBtYXBfa2V5X2NsZWFyKEtFWV9TQVQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5YTogbWFwX2tleV9jbGVhcihLRVlfUFZSKTsJCWJyZWFrOwotCi0JCQkJY2FzZSAweDA5YzogbWFwX2tleV9jbGVhcihLRVlfQ0hBTk5FTFVQKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDA5ZDogbWFwX2tleV9jbGVhcihLRVlfQ0hBTk5FTERPV04pOwlicmVhazsKLQkJCQljYXNlIDB4MGEwOiBtYXBfa2V5X2NsZWFyKEtFWV9WQ1IyKTsJCWJyZWFrOwotCi0JCQkJY2FzZSAweDBiMDogbWFwX2tleV9jbGVhcihLRVlfUExBWSk7CQlicmVhazsKLQkJCQljYXNlIDB4MGIxOiBtYXBfa2V5X2NsZWFyKEtFWV9QQVVTRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MGIyOiBtYXBfa2V5X2NsZWFyKEtFWV9SRUNPUkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDBiMzogbWFwX2tleV9jbGVhcihLRVlfRkFTVEZPUldBUkQpOwlicmVhazsKLQkJCQljYXNlIDB4MGI0OiBtYXBfa2V5X2NsZWFyKEtFWV9SRVdJTkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDBiNTogbWFwX2tleV9jbGVhcihLRVlfTkVYVFNPTkcpOwlicmVhazsKLQkJCQljYXNlIDB4MGI2OiBtYXBfa2V5X2NsZWFyKEtFWV9QUkVWSU9VU1NPTkcpOwlicmVhazsKLQkJCQljYXNlIDB4MGI3OiBtYXBfa2V5X2NsZWFyKEtFWV9TVE9QQ0QpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDBiODogbWFwX2tleV9jbGVhcihLRVlfRUpFQ1RDRCk7CQlicmVhazsKLQkJCQljYXNlIDB4MGJjOiBtYXBfa2V5X2NsZWFyKEtFWV9NRURJQV9SRVBFQVQpOwlicmVhazsKLQotCQkJCWNhc2UgMHgwY2Q6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVlQQVVTRSk7CWJyZWFrOwotCQkJICAgICAgICBjYXNlIDB4MGUwOiBtYXBfYWJzX2NsZWFyKEFCU19WT0xVTUUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDBlMjogbWFwX2tleV9jbGVhcihLRVlfTVVURSk7CQlicmVhazsKLQkJCQljYXNlIDB4MGU1OiBtYXBfa2V5X2NsZWFyKEtFWV9CQVNTQk9PU1QpOwlicmVhazsKLQkJCQljYXNlIDB4MGU5OiBtYXBfa2V5X2NsZWFyKEtFWV9WT0xVTUVVUCk7CWJyZWFrOwotCQkJCWNhc2UgMHgwZWE6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPTFVNRURPV04pOwlicmVhazsKLQotCQkJCWNhc2UgMHgxODI6IG1hcF9rZXlfY2xlYXIoS0VZX0JPT0tNQVJLUyk7CWJyZWFrOwotCQkJCWNhc2UgMHgxODM6IG1hcF9rZXlfY2xlYXIoS0VZX0NPTkZJRyk7CQlicmVhazsKLQkJCQljYXNlIDB4MTg0OiBtYXBfa2V5X2NsZWFyKEtFWV9XT1JEUFJPQ0VTU09SKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDE4NTogbWFwX2tleV9jbGVhcihLRVlfRURJVE9SKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxODY6IG1hcF9rZXlfY2xlYXIoS0VZX1NQUkVBRFNIRUVUKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDE4NzogbWFwX2tleV9jbGVhcihLRVlfR1JBUEhJQ1NFRElUT1IpOwlicmVhazsKLQkJCQljYXNlIDB4MTg4OiBtYXBfa2V5X2NsZWFyKEtFWV9QUkVTRU5UQVRJT04pOwlicmVhazsKLQkJCQljYXNlIDB4MTg5OiBtYXBfa2V5X2NsZWFyKEtFWV9EQVRBQkFTRSk7CWJyZWFrOwotCQkJCWNhc2UgMHgxOGE6IG1hcF9rZXlfY2xlYXIoS0VZX01BSUwpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDE4YjogbWFwX2tleV9jbGVhcihLRVlfTkVXUyk7CQlicmVhazsKLQkJCQljYXNlIDB4MThjOiBtYXBfa2V5X2NsZWFyKEtFWV9WT0lDRU1BSUwpOwlicmVhazsKLQkJCQljYXNlIDB4MThkOiBtYXBfa2V5X2NsZWFyKEtFWV9BRERSRVNTQk9PSyk7CWJyZWFrOwotCQkJCWNhc2UgMHgxOGU6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTEVOREFSKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDE5MTogbWFwX2tleV9jbGVhcihLRVlfRklOQU5DRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MTkyOiBtYXBfa2V5X2NsZWFyKEtFWV9DQUxDKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxOTQ6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTEUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDE5NjogbWFwX2tleV9jbGVhcihLRVlfV1dXKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxOWM6IG1hcF9rZXlfY2xlYXIoS0VZX0xPR09GRik7CQlicmVhazsKLQkJCQljYXNlIDB4MTllOiBtYXBfa2V5X2NsZWFyKEtFWV9DT0ZGRUUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDFhNjogbWFwX2tleV9jbGVhcihLRVlfSEVMUCk7CQlicmVhazsKLQkJCQljYXNlIDB4MWE3OiBtYXBfa2V5X2NsZWFyKEtFWV9ET0NVTUVOVFMpOwlicmVhazsKLQkJCQljYXNlIDB4MWFiOiBtYXBfa2V5X2NsZWFyKEtFWV9TUEVMTENIRUNLKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDFiNjogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDFiNzogbWFwX2tleV9jbGVhcihLRVlfU09VTkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDFiYzogbWFwX2tleV9jbGVhcihLRVlfTUVTU0VOR0VSKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDFiZDogbWFwX2tleV9jbGVhcihLRVlfSU5GTyk7CQlicmVhazsKLQkJCQljYXNlIDB4MjAxOiBtYXBfa2V5X2NsZWFyKEtFWV9ORVcpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIwMjogbWFwX2tleV9jbGVhcihLRVlfT1BFTik7CQlicmVhazsKLQkJCQljYXNlIDB4MjAzOiBtYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MjA0OiBtYXBfa2V5X2NsZWFyKEtFWV9FWElUKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMDc6IG1hcF9rZXlfY2xlYXIoS0VZX1NBVkUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIwODogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIwOTogbWFwX2tleV9jbGVhcihLRVlfUFJPUFMpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIxYTogbWFwX2tleV9jbGVhcihLRVlfVU5ETyk7CQlicmVhazsKLQkJCQljYXNlIDB4MjFiOiBtYXBfa2V5X2NsZWFyKEtFWV9DT1BZKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMWM6IG1hcF9rZXlfY2xlYXIoS0VZX0NVVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjFkOiBtYXBfa2V5X2NsZWFyKEtFWV9QQVNURSk7CQlicmVhazsKLQkJCQljYXNlIDB4MjFmOiBtYXBfa2V5X2NsZWFyKEtFWV9GSU5EKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMjE6IG1hcF9rZXlfY2xlYXIoS0VZX1NFQVJDSCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjIyOiBtYXBfa2V5X2NsZWFyKEtFWV9HT1RPKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMjM6IG1hcF9rZXlfY2xlYXIoS0VZX0hPTUVQQUdFKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDIyNDogbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CQlicmVhazsKLQkJCQljYXNlIDB4MjI1OiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJEKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMjY6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIyNzogbWFwX2tleV9jbGVhcihLRVlfUkVGUkVTSCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjJhOiBtYXBfa2V5X2NsZWFyKEtFWV9CT09LTUFSS1MpOwlicmVhazsKLQkJCQljYXNlIDB4MjJkOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NSU4pOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIyZTogbWFwX2tleV9jbGVhcihLRVlfWk9PTU9VVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjJmOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NUkVTRVQpOwlicmVhazsKLQkJCQljYXNlIDB4MjMzOiBtYXBfa2V5X2NsZWFyKEtFWV9TQ1JPTExVUCk7CWJyZWFrOwotCQkJCWNhc2UgMHgyMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTERPV04pOwlicmVhazsKLQkJCQljYXNlIDB4MjM4OiBtYXBfcmVsKFJFTF9IV0hFRUwpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDI1ZjogbWFwX2tleV9jbGVhcihLRVlfQ0FOQ0VMKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyNzk6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRE8pOwkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4Mjg5OiBtYXBfa2V5X2NsZWFyKEtFWV9SRVBMWSk7CQlicmVhazsKLQkJCQljYXNlIDB4MjhiOiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJETUFJTCk7CWJyZWFrOwotCQkJCWNhc2UgMHgyOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1NFTkQpOwkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX0hQVkVORE9SOgkvKiBSZXBvcnRlZCBvbiBhIER1dGNoIGxheW91dCBIUDUzMDggKi8KLQotCQkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7Ci0JCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCSAgICAgICAgY2FzZSAweDAyMTogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOyAgICAgICAgICAgYnJlYWs7Ci0JCQkJY2FzZSAweDA3MDogbWFwX2tleV9jbGVhcihLRVlfSFApOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA3MTogbWFwX2tleV9jbGVhcihLRVlfQ0FNRVJBKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwNzI6IG1hcF9rZXlfY2xlYXIoS0VZX1NPVU5EKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwNzM6IG1hcF9rZXlfY2xlYXIoS0VZX1FVRVNUSU9OKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDA4MDogbWFwX2tleV9jbGVhcihLRVlfRU1BSUwpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4MTogbWFwX2tleV9jbGVhcihLRVlfQ0hBVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDgyOiBtYXBfa2V5X2NsZWFyKEtFWV9TRUFSQ0gpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4MzogbWFwX2tleV9jbGVhcihLRVlfQ09OTkVDVCk7CSAgICAgICAgYnJlYWs7Ci0JCQkJY2FzZSAweDA4NDogbWFwX2tleV9jbGVhcihLRVlfRklOQU5DRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MDg1OiBtYXBfa2V5X2NsZWFyKEtFWV9TUE9SVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDg2OiBtYXBfa2V5X2NsZWFyKEtFWV9TSE9QKTsJICAgICAgICBicmVhazsKLQkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX01TVkVORE9SOgotCi0JCQlnb3RvIGlnbm9yZTsKLQotCQljYXNlIEhJRF9VUF9DVVNUT006IC8qIFJlcG9ydGVkIG9uIExvZ2l0ZWNoIGFuZCBBcHBsZSBVU0Iga2V5Ym9hcmRzICovCi0KLQkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOwotCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCQljYXNlIDB4MDAzOgotCQkJCQkvKiBUaGUgZm4ga2V5IG9uIEFwcGxlIFVTQiBrZXlib2FyZHMgKi8KLQkJCQkJbWFwX2tleV9jbGVhcihLRVlfRk4pOwotCQkJCQloaWRpbnB1dF9hcHBsZV9zZXR1cChpbnB1dCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9MT0dJVkVORE9SOgotCi0JCQlnb3RvIGlnbm9yZTsKLQkJCi0JCWNhc2UgSElEX1VQX1BJRDoKLQotCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCQljYXNlIDB4YTQ6IG1hcF9rZXlfY2xlYXIoQlROX0RFQUQpOwlicmVhazsKLQkJCQlkZWZhdWx0OiBnb3RvIGlnbm9yZTsKLQkJCX0KLQkJCWJyZWFrOwotCisJCXN3aXRjaCAoZmllbGQtPmFwcGxpY2F0aW9uKSB7CisJCWNhc2UgSElEX0dEX01PVVNFOgorCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7CisJCWNhc2UgSElEX0dEX0pPWVNUSUNLOiBjb2RlICs9IDB4MTIwOyBicmVhazsKKwkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gMHgxMzA7IGJyZWFrOwogCQlkZWZhdWx0OgotCQl1bmtub3duOgotCQkJaWYgKGZpZWxkLT5yZXBvcnRfc2l6ZSA9PSAxKSB7Ci0JCQkJaWYgKGZpZWxkLT5yZXBvcnQtPnR5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpIHsKLQkJCQkJbWFwX2xlZChMRURfTUlTQyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQltYXBfa2V5KEJUTl9NSVNDKTsKLQkJCQlicmVhazsKKwkJCXN3aXRjaCAoZmllbGQtPnBoeXNpY2FsKSB7CisJCQljYXNlIEhJRF9HRF9NT1VTRToKKwkJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IDB4MTEwOyBicmVhazsKKwkJCWNhc2UgSElEX0dEX0pPWVNUSUNLOiBjb2RlICs9IDB4MTIwOyBicmVhazsKKwkJCWNhc2UgSElEX0dEX0dBTUVQQUQ6ICBjb2RlICs9IDB4MTMwOyBicmVhazsKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgICBjb2RlICs9IDB4MTAwOwogCQkJfQotCQkJaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpIHsKLQkJCQltYXBfcmVsKFJFTF9NSVNDKTsKLQkJCQlicmVhazsKKwkJfQorCisJCW1hcF9rZXkoY29kZSk7CisJCWJyZWFrOworCisJY2FzZSBISURfVVBfU0lNVUxBVElPTjoKKwkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmZmZmKSB7CisJCWNhc2UgMHhiYTogbWFwX2FicyhBQlNfUlVEREVSKTsgICBicmVhazsKKwkJY2FzZSAweGJiOiBtYXBfYWJzKEFCU19USFJPVFRMRSk7IGJyZWFrOworCQljYXNlIDB4YzQ6IG1hcF9hYnMoQUJTX0dBUyk7ICAgICAgYnJlYWs7CisJCWNhc2UgMHhjNTogbWFwX2FicyhBQlNfQlJBS0UpOyAgICBicmVhazsKKwkJY2FzZSAweGM4OiBtYXBfYWJzKEFCU19XSEVFTCk7ICAgIGJyZWFrOworCQlkZWZhdWx0OiAgIGdvdG8gaWdub3JlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBISURfVVBfR0VOREVTSzoKKwkJaWYgKCh1c2FnZS0+aGlkICYgMHhmMCkgPT0gMHg4MCkgewkvKiBTeXN0ZW1Db250cm9sICovCisJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGYpIHsKKwkJCWNhc2UgMHgxOiBtYXBfa2V5X2NsZWFyKEtFWV9QT1dFUik7ICBicmVhazsKKwkJCWNhc2UgMHgyOiBtYXBfa2V5X2NsZWFyKEtFWV9TTEVFUCk7ICBicmVhazsKKwkJCWNhc2UgMHgzOiBtYXBfa2V5X2NsZWFyKEtFWV9XQUtFVVApOyBicmVhazsKKwkJCWRlZmF1bHQ6IGdvdG8gdW5rbm93bjsKIAkJCX0KLQkJCW1hcF9hYnMoQUJTX01JU0MpOwogCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHVzYWdlLT5oaWQgJiAweGYwKSA9PSAweDkwKSB7CS8qIEQtcGFkICovCisJCQlzd2l0Y2ggKHVzYWdlLT5oaWQpIHsKKwkJCWNhc2UgSElEX0dEX1VQOgkgICB1c2FnZS0+aGF0X2RpciA9IDE7IGJyZWFrOworCQkJY2FzZSBISURfR0RfRE9XTjogIHVzYWdlLT5oYXRfZGlyID0gNTsgYnJlYWs7CisJCQljYXNlIEhJRF9HRF9SSUdIVDogdXNhZ2UtPmhhdF9kaXIgPSAzOyBicmVhazsKKwkJCWNhc2UgSElEX0dEX0xFRlQ6ICB1c2FnZS0+aGF0X2RpciA9IDc7IGJyZWFrOworCQkJZGVmYXVsdDogZ290byB1bmtub3duOworCQkJfQorCQkJaWYgKGZpZWxkLT5kcGFkKSB7CisJCQkJbWFwX2FicyhmaWVsZC0+ZHBhZCk7CisJCQkJZ290byBpZ25vcmU7CisJCQl9CisJCQltYXBfYWJzKEFCU19IQVQwWCk7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAodXNhZ2UtPmhpZCkgeworCQkvKiBUaGVzZSB1c2FnZSBJRHMgbWFwIGRpcmVjdGx5IHRvIHRoZSB1c2FnZSBjb2Rlcy4gKi8KKwkJY2FzZSBISURfR0RfWDogY2FzZSBISURfR0RfWTogY2FzZSBISURfR0RfWjoKKwkJY2FzZSBISURfR0RfUlg6IGNhc2UgSElEX0dEX1JZOiBjYXNlIEhJRF9HRF9SWjoKKwkJY2FzZSBISURfR0RfU0xJREVSOiBjYXNlIEhJRF9HRF9ESUFMOiBjYXNlIEhJRF9HRF9XSEVFTDoKKwkJCWlmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKQorCQkJCW1hcF9yZWwodXNhZ2UtPmhpZCAmIDB4Zik7CisJCQllbHNlCisJCQkJbWFwX2Ficyh1c2FnZS0+aGlkICYgMHhmKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSElEX0dEX0hBVFNXSVRDSDoKKwkJCXVzYWdlLT5oYXRfbWluID0gZmllbGQtPmxvZ2ljYWxfbWluaW11bTsKKwkJCXVzYWdlLT5oYXRfbWF4ID0gZmllbGQtPmxvZ2ljYWxfbWF4aW11bTsKKwkJCW1hcF9hYnMoQUJTX0hBVDBYKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSElEX0dEX1NUQVJUOgltYXBfa2V5X2NsZWFyKEJUTl9TVEFSVCk7CWJyZWFrOworCQljYXNlIEhJRF9HRF9TRUxFQ1Q6CW1hcF9rZXlfY2xlYXIoQlROX1NFTEVDVCk7CWJyZWFrOworCisJCWRlZmF1bHQ6IGdvdG8gdW5rbm93bjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBISURfVVBfTEVEOgorCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsJCSAgICAgIC8qIEhJRC1WYWx1ZTogICAgICAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDAxOiAgbWFwX2xlZCAoTEVEX05VTUwpOyAgICAgYnJlYWs7ICAgIC8qICAgIk51bSBMb2NrIiAgICAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDAyOiAgbWFwX2xlZCAoTEVEX0NBUFNMKTsgICAgYnJlYWs7ICAgIC8qICAgIkNhcHMgTG9jayIgICAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDAzOiAgbWFwX2xlZCAoTEVEX1NDUk9MTEwpOyAgYnJlYWs7ICAgIC8qICAgIlNjcm9sbCBMb2NrIiAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDA0OiAgbWFwX2xlZCAoTEVEX0NPTVBPU0UpOyAgYnJlYWs7ICAgIC8qICAgIkNvbXBvc2UiICAgICAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDA1OiAgbWFwX2xlZCAoTEVEX0tBTkEpOyAgICAgYnJlYWs7ICAgIC8qICAgIkthbmEiICAgICAgICAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDI3OiAgbWFwX2xlZCAoTEVEX1NMRUVQKTsgICAgYnJlYWs7ICAgIC8qICAgIlN0YW5kLUJ5IiAgICAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDRjOiAgbWFwX2xlZCAoTEVEX1NVU1BFTkQpOyAgYnJlYWs7ICAgIC8qICAgIlN5c3RlbSBTdXNwZW5kIiAgICAgICAgICAgKi8KKwkJY2FzZSAweDA5OiAgbWFwX2xlZCAoTEVEX01VVEUpOyAgICAgYnJlYWs7ICAgIC8qICAgIk11dGUiICAgICAgICAgICAgICAgICAgICAgKi8KKwkJY2FzZSAweDRiOiAgbWFwX2xlZCAoTEVEX01JU0MpOyAgICAgYnJlYWs7ICAgIC8qICAgIkdlbmVyaWMgSW5kaWNhdG9yIiAgICAgICAgKi8KKwkJY2FzZSAweDE5OiAgbWFwX2xlZCAoTEVEX01BSUwpOyAgICAgYnJlYWs7ICAgIC8qICAgIk1lc3NhZ2UgV2FpdGluZyIgICAgICAgICAgKi8KKwkJY2FzZSAweDRkOiAgbWFwX2xlZCAoTEVEX0NIQVJHSU5HKTsgYnJlYWs7ICAgIC8qICAgIkV4dGVybmFsIFBvd2VyIENvbm5lY3RlZCIgKi8KKworCQlkZWZhdWx0OiBnb3RvIGlnbm9yZTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSElEX1VQX0RJR0lUSVpFUjoKKwkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmZikgeworCQljYXNlIDB4MzA6IC8qIFRpcFByZXNzdXJlICovCisJCQlpZiAoIXRlc3RfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCkpIHsKKwkJCQlkZXZpY2UtPnF1aXJrcyB8PSBISURfUVVJUktfTk9UT1VDSDsKKwkJCQlzZXRfYml0KEVWX0tFWSwgaW5wdXQtPmV2Yml0KTsKKwkJCQlzZXRfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCk7CisJCQl9CisJCQltYXBfYWJzX2NsZWFyKEFCU19QUkVTU1VSRSk7CisJCQlicmVhazsKKworCQljYXNlIDB4MzI6IC8qIEluUmFuZ2UgKi8KKwkJCXN3aXRjaCAoZmllbGQtPnBoeXNpY2FsICYgMHhmZikgeworCQkJY2FzZSAweDIxOiBtYXBfa2V5KEJUTl9UT09MX01PVVNFKTsgYnJlYWs7CisJCQljYXNlIDB4MjI6IG1hcF9rZXkoQlROX1RPT0xfRklOR0VSKTsgYnJlYWs7CisJCQlkZWZhdWx0OiBtYXBfa2V5KEJUTl9UT09MX1BFTik7IGJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAweDNjOiAvKiBJbnZlcnQgKi8KKwkJCW1hcF9rZXlfY2xlYXIoQlROX1RPT0xfUlVCQkVSKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgzMzogLyogVG91Y2ggKi8KKwkJY2FzZSAweDQyOiAvKiBUaXBTd2l0Y2ggKi8KKwkJY2FzZSAweDQzOiAvKiBUaXBTd2l0Y2gyICovCisJCQlkZXZpY2UtPnF1aXJrcyAmPSB+SElEX1FVSVJLX05PVE9VQ0g7CisJCQltYXBfa2V5X2NsZWFyKEJUTl9UT1VDSCk7CisJCQlicmVhazsKKworCQljYXNlIDB4NDQ6IC8qIEJhcnJlbFN3aXRjaCAqLworCQkJbWFwX2tleV9jbGVhcihCVE5fU1RZTFVTKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6ICBnb3RvIHVua25vd247CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhJRF9VUF9DT05TVU1FUjoJLyogVVNCIEhVVCB2MS4xLCBwYWdlcyA1Ni02MiAqLworCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJY2FzZSAweDAwMDogZ290byBpZ25vcmU7CisJCWNhc2UgMHgwMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NMRUVQKTsJCWJyZWFrOworCQljYXNlIDB4MDM2OiBtYXBfa2V5X2NsZWFyKEJUTl9NSVNDKTsJCWJyZWFrOworCisJCWNhc2UgMHgwNDA6IG1hcF9rZXlfY2xlYXIoS0VZX01FTlUpOwkJYnJlYWs7CisJCWNhc2UgMHgwNDU6IG1hcF9rZXlfY2xlYXIoS0VZX1JBRElPKTsJCWJyZWFrOworCisJCWNhc2UgMHgwODM6IG1hcF9rZXlfY2xlYXIoS0VZX0xBU1QpOwkJYnJlYWs7CisJCWNhc2UgMHgwODg6IG1hcF9rZXlfY2xlYXIoS0VZX1BDKTsJCWJyZWFrOworCQljYXNlIDB4MDg5OiBtYXBfa2V5X2NsZWFyKEtFWV9UVik7CQlicmVhazsKKwkJY2FzZSAweDA4YTogbWFwX2tleV9jbGVhcihLRVlfV1dXKTsJCWJyZWFrOworCQljYXNlIDB4MDhiOiBtYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7CisJCWNhc2UgMHgwOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1BIT05FKTsJCWJyZWFrOworCQljYXNlIDB4MDhkOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HUkFNKTsJCWJyZWFrOworCQljYXNlIDB4MDhlOiBtYXBfa2V5X2NsZWFyKEtFWV9WSURFT1BIT05FKTsJYnJlYWs7CisJCWNhc2UgMHgwOGY6IG1hcF9rZXlfY2xlYXIoS0VZX0dBTUVTKTsJCWJyZWFrOworCQljYXNlIDB4MDkwOiBtYXBfa2V5X2NsZWFyKEtFWV9NRU1PKTsJCWJyZWFrOworCQljYXNlIDB4MDkxOiBtYXBfa2V5X2NsZWFyKEtFWV9DRCk7CQlicmVhazsKKwkJY2FzZSAweDA5MjogbWFwX2tleV9jbGVhcihLRVlfVkNSKTsJCWJyZWFrOworCQljYXNlIDB4MDkzOiBtYXBfa2V5X2NsZWFyKEtFWV9UVU5FUik7CQlicmVhazsKKwkJY2FzZSAweDA5NDogbWFwX2tleV9jbGVhcihLRVlfRVhJVCk7CQlicmVhazsKKwkJY2FzZSAweDA5NTogbWFwX2tleV9jbGVhcihLRVlfSEVMUCk7CQlicmVhazsKKwkJY2FzZSAweDA5NjogbWFwX2tleV9jbGVhcihLRVlfVEFQRSk7CQlicmVhazsKKwkJY2FzZSAweDA5NzogbWFwX2tleV9jbGVhcihLRVlfVFYyKTsJCWJyZWFrOworCQljYXNlIDB4MDk4OiBtYXBfa2V5X2NsZWFyKEtFWV9TQVQpOwkJYnJlYWs7CisJCWNhc2UgMHgwOWE6IG1hcF9rZXlfY2xlYXIoS0VZX1BWUik7CQlicmVhazsKKworCQljYXNlIDB4MDljOiBtYXBfa2V5X2NsZWFyKEtFWV9DSEFOTkVMVVApOwlicmVhazsKKwkJY2FzZSAweDA5ZDogbWFwX2tleV9jbGVhcihLRVlfQ0hBTk5FTERPV04pOwlicmVhazsKKwkJY2FzZSAweDBhMDogbWFwX2tleV9jbGVhcihLRVlfVkNSMik7CQlicmVhazsKKworCQljYXNlIDB4MGIwOiBtYXBfa2V5X2NsZWFyKEtFWV9QTEFZKTsJCWJyZWFrOworCQljYXNlIDB4MGIxOiBtYXBfa2V5X2NsZWFyKEtFWV9QQVVTRSk7CQlicmVhazsKKwkJY2FzZSAweDBiMjogbWFwX2tleV9jbGVhcihLRVlfUkVDT1JEKTsJCWJyZWFrOworCQljYXNlIDB4MGIzOiBtYXBfa2V5X2NsZWFyKEtFWV9GQVNURk9SV0FSRCk7CWJyZWFrOworCQljYXNlIDB4MGI0OiBtYXBfa2V5X2NsZWFyKEtFWV9SRVdJTkQpOwkJYnJlYWs7CisJCWNhc2UgMHgwYjU6IG1hcF9rZXlfY2xlYXIoS0VZX05FWFRTT05HKTsJYnJlYWs7CisJCWNhc2UgMHgwYjY6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVZJT1VTU09ORyk7CWJyZWFrOworCQljYXNlIDB4MGI3OiBtYXBfa2V5X2NsZWFyKEtFWV9TVE9QQ0QpOwkJYnJlYWs7CisJCWNhc2UgMHgwYjg6IG1hcF9rZXlfY2xlYXIoS0VZX0VKRUNUQ0QpOwkJYnJlYWs7CisJCWNhc2UgMHgwYmM6IG1hcF9rZXlfY2xlYXIoS0VZX01FRElBX1JFUEVBVCk7CWJyZWFrOworCisJCWNhc2UgMHgwY2Q6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVlQQVVTRSk7CWJyZWFrOworCQljYXNlIDB4MGUwOiBtYXBfYWJzX2NsZWFyKEFCU19WT0xVTUUpOwkJYnJlYWs7CisJCWNhc2UgMHgwZTI6IG1hcF9rZXlfY2xlYXIoS0VZX01VVEUpOwkJYnJlYWs7CisJCWNhc2UgMHgwZTU6IG1hcF9rZXlfY2xlYXIoS0VZX0JBU1NCT09TVCk7CWJyZWFrOworCQljYXNlIDB4MGU5OiBtYXBfa2V5X2NsZWFyKEtFWV9WT0xVTUVVUCk7CWJyZWFrOworCQljYXNlIDB4MGVhOiBtYXBfa2V5X2NsZWFyKEtFWV9WT0xVTUVET1dOKTsJYnJlYWs7CisKKwkJY2FzZSAweDE4MjogbWFwX2tleV9jbGVhcihLRVlfQk9PS01BUktTKTsJYnJlYWs7CisJCWNhc2UgMHgxODM6IG1hcF9rZXlfY2xlYXIoS0VZX0NPTkZJRyk7CQlicmVhazsKKwkJY2FzZSAweDE4NDogbWFwX2tleV9jbGVhcihLRVlfV09SRFBST0NFU1NPUik7CWJyZWFrOworCQljYXNlIDB4MTg1OiBtYXBfa2V5X2NsZWFyKEtFWV9FRElUT1IpOwkJYnJlYWs7CisJCWNhc2UgMHgxODY6IG1hcF9rZXlfY2xlYXIoS0VZX1NQUkVBRFNIRUVUKTsJYnJlYWs7CisJCWNhc2UgMHgxODc6IG1hcF9rZXlfY2xlYXIoS0VZX0dSQVBISUNTRURJVE9SKTsJYnJlYWs7CisJCWNhc2UgMHgxODg6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVNFTlRBVElPTik7CWJyZWFrOworCQljYXNlIDB4MTg5OiBtYXBfa2V5X2NsZWFyKEtFWV9EQVRBQkFTRSk7CWJyZWFrOworCQljYXNlIDB4MThhOiBtYXBfa2V5X2NsZWFyKEtFWV9NQUlMKTsJCWJyZWFrOworCQljYXNlIDB4MThiOiBtYXBfa2V5X2NsZWFyKEtFWV9ORVdTKTsJCWJyZWFrOworCQljYXNlIDB4MThjOiBtYXBfa2V5X2NsZWFyKEtFWV9WT0lDRU1BSUwpOwlicmVhazsKKwkJY2FzZSAweDE4ZDogbWFwX2tleV9jbGVhcihLRVlfQUREUkVTU0JPT0spOwlicmVhazsKKwkJY2FzZSAweDE4ZTogbWFwX2tleV9jbGVhcihLRVlfQ0FMRU5EQVIpOwlicmVhazsKKwkJY2FzZSAweDE5MTogbWFwX2tleV9jbGVhcihLRVlfRklOQU5DRSk7CQlicmVhazsKKwkJY2FzZSAweDE5MjogbWFwX2tleV9jbGVhcihLRVlfQ0FMQyk7CQlicmVhazsKKwkJY2FzZSAweDE5NDogbWFwX2tleV9jbGVhcihLRVlfRklMRSk7CQlicmVhazsKKwkJY2FzZSAweDE5NjogbWFwX2tleV9jbGVhcihLRVlfV1dXKTsJCWJyZWFrOworCQljYXNlIDB4MTljOiBtYXBfa2V5X2NsZWFyKEtFWV9MT0dPRkYpOwkJYnJlYWs7CisJCWNhc2UgMHgxOWU6IG1hcF9rZXlfY2xlYXIoS0VZX0NPRkZFRSk7CQlicmVhazsKKwkJY2FzZSAweDFhNjogbWFwX2tleV9jbGVhcihLRVlfSEVMUCk7CQlicmVhazsKKwkJY2FzZSAweDFhNzogbWFwX2tleV9jbGVhcihLRVlfRE9DVU1FTlRTKTsJYnJlYWs7CisJCWNhc2UgMHgxYWI6IG1hcF9rZXlfY2xlYXIoS0VZX1NQRUxMQ0hFQ0spOwlicmVhazsKKwkJY2FzZSAweDFiNjogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7CisJCWNhc2UgMHgxYjc6IG1hcF9rZXlfY2xlYXIoS0VZX1NPVU5EKTsJCWJyZWFrOworCQljYXNlIDB4MWJjOiBtYXBfa2V5X2NsZWFyKEtFWV9NRVNTRU5HRVIpOwlicmVhazsKKwkJY2FzZSAweDFiZDogbWFwX2tleV9jbGVhcihLRVlfSU5GTyk7CQlicmVhazsKKwkJY2FzZSAweDIwMTogbWFwX2tleV9jbGVhcihLRVlfTkVXKTsJCWJyZWFrOworCQljYXNlIDB4MjAyOiBtYXBfa2V5X2NsZWFyKEtFWV9PUEVOKTsJCWJyZWFrOworCQljYXNlIDB4MjAzOiBtYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CQlicmVhazsKKwkJY2FzZSAweDIwNDogbWFwX2tleV9jbGVhcihLRVlfRVhJVCk7CQlicmVhazsKKwkJY2FzZSAweDIwNzogbWFwX2tleV9jbGVhcihLRVlfU0FWRSk7CQlicmVhazsKKwkJY2FzZSAweDIwODogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOwkJYnJlYWs7CisJCWNhc2UgMHgyMDk6IG1hcF9rZXlfY2xlYXIoS0VZX1BST1BTKTsJCWJyZWFrOworCQljYXNlIDB4MjFhOiBtYXBfa2V5X2NsZWFyKEtFWV9VTkRPKTsJCWJyZWFrOworCQljYXNlIDB4MjFiOiBtYXBfa2V5X2NsZWFyKEtFWV9DT1BZKTsJCWJyZWFrOworCQljYXNlIDB4MjFjOiBtYXBfa2V5X2NsZWFyKEtFWV9DVVQpOwkJYnJlYWs7CisJCWNhc2UgMHgyMWQ6IG1hcF9rZXlfY2xlYXIoS0VZX1BBU1RFKTsJCWJyZWFrOworCQljYXNlIDB4MjFmOiBtYXBfa2V5X2NsZWFyKEtFWV9GSU5EKTsJCWJyZWFrOworCQljYXNlIDB4MjIxOiBtYXBfa2V5X2NsZWFyKEtFWV9TRUFSQ0gpOwkJYnJlYWs7CisJCWNhc2UgMHgyMjI6IG1hcF9rZXlfY2xlYXIoS0VZX0dPVE8pOwkJYnJlYWs7CisJCWNhc2UgMHgyMjM6IG1hcF9rZXlfY2xlYXIoS0VZX0hPTUVQQUdFKTsJYnJlYWs7CisJCWNhc2UgMHgyMjQ6IG1hcF9rZXlfY2xlYXIoS0VZX0JBQ0spOwkJYnJlYWs7CisJCWNhc2UgMHgyMjU6IG1hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkQpOwkJYnJlYWs7CisJCWNhc2UgMHgyMjY6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJYnJlYWs7CisJCWNhc2UgMHgyMjc6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRlJFU0gpOwkJYnJlYWs7CisJCWNhc2UgMHgyMmE6IG1hcF9rZXlfY2xlYXIoS0VZX0JPT0tNQVJLUyk7CWJyZWFrOworCQljYXNlIDB4MjJkOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NSU4pOwkJYnJlYWs7CisJCWNhc2UgMHgyMmU6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01PVVQpOwkJYnJlYWs7CisJCWNhc2UgMHgyMmY6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01SRVNFVCk7CWJyZWFrOworCQljYXNlIDB4MjMzOiBtYXBfa2V5X2NsZWFyKEtFWV9TQ1JPTExVUCk7CWJyZWFrOworCQljYXNlIDB4MjM0OiBtYXBfa2V5X2NsZWFyKEtFWV9TQ1JPTExET1dOKTsJYnJlYWs7CisJCWNhc2UgMHgyMzg6IG1hcF9yZWwoUkVMX0hXSEVFTCk7CQlicmVhazsKKwkJY2FzZSAweDI1ZjogbWFwX2tleV9jbGVhcihLRVlfQ0FOQ0VMKTsJCWJyZWFrOworCQljYXNlIDB4Mjc5OiBtYXBfa2V5X2NsZWFyKEtFWV9SRURPKTsJCWJyZWFrOworCisJCWNhc2UgMHgyODk6IG1hcF9rZXlfY2xlYXIoS0VZX1JFUExZKTsJCWJyZWFrOworCQljYXNlIDB4MjhiOiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJETUFJTCk7CWJyZWFrOworCQljYXNlIDB4MjhjOiBtYXBfa2V5X2NsZWFyKEtFWV9TRU5EKTsJCWJyZWFrOworCisJCWRlZmF1bHQ6ICAgIGdvdG8gaWdub3JlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBISURfVVBfSFBWRU5ET1I6CS8qIFJlcG9ydGVkIG9uIGEgRHV0Y2ggbGF5b3V0IEhQNTMwOCAqLworCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKwkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCWNhc2UgMHgwMjE6IG1hcF9rZXlfY2xlYXIoS0VZX1BSSU5UKTsgICAgICAgICAgIGJyZWFrOworCQljYXNlIDB4MDcwOiBtYXBfa2V5X2NsZWFyKEtFWV9IUCk7CQlicmVhazsKKwkJY2FzZSAweDA3MTogbWFwX2tleV9jbGVhcihLRVlfQ0FNRVJBKTsJCWJyZWFrOworCQljYXNlIDB4MDcyOiBtYXBfa2V5X2NsZWFyKEtFWV9TT1VORCk7CQlicmVhazsKKwkJY2FzZSAweDA3MzogbWFwX2tleV9jbGVhcihLRVlfUVVFU1RJT04pOwlicmVhazsKKwkJY2FzZSAweDA4MDogbWFwX2tleV9jbGVhcihLRVlfRU1BSUwpOwkJYnJlYWs7CisJCWNhc2UgMHgwODE6IG1hcF9rZXlfY2xlYXIoS0VZX0NIQVQpOwkJYnJlYWs7CisJCWNhc2UgMHgwODI6IG1hcF9rZXlfY2xlYXIoS0VZX1NFQVJDSCk7CQlicmVhazsKKwkJY2FzZSAweDA4MzogbWFwX2tleV9jbGVhcihLRVlfQ09OTkVDVCk7CSAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgwODQ6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTkFOQ0UpOwkJYnJlYWs7CisJCWNhc2UgMHgwODU6IG1hcF9rZXlfY2xlYXIoS0VZX1NQT1JUKTsJCWJyZWFrOworCQljYXNlIDB4MDg2OiBtYXBfa2V5X2NsZWFyKEtFWV9TSE9QKTsJICAgICAgICBicmVhazsKKwkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhJRF9VUF9NU1ZFTkRPUjoKKwkJZ290byBpZ25vcmU7CisKKwljYXNlIEhJRF9VUF9DVVNUT006IC8qIFJlcG9ydGVkIG9uIExvZ2l0ZWNoIGFuZCBBcHBsZSBVU0Iga2V5Ym9hcmRzICovCisJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQlnb3RvIGlnbm9yZTsKKworCWNhc2UgSElEX1VQX0xPR0lWRU5ET1I6CisJCWdvdG8gaWdub3JlOworCQorCWNhc2UgSElEX1VQX1BJRDoKKwkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCWNhc2UgMHhhNDogbWFwX2tleV9jbGVhcihCVE5fREVBRCk7CWJyZWFrOworCQlkZWZhdWx0OiBnb3RvIGlnbm9yZTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJdW5rbm93bjoKKwkJaWYgKGZpZWxkLT5yZXBvcnRfc2l6ZSA9PSAxKSB7CisJCQlpZiAoZmllbGQtPnJlcG9ydC0+dHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgeworCQkJCW1hcF9sZWQoTEVEX01JU0MpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWFwX2tleShCVE5fTUlTQyk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9SRUxBVElWRSkgeworCQkJbWFwX3JlbChSRUxfTUlTQyk7CisJCQlicmVhazsKKwkJfQorCQltYXBfYWJzKEFCU19NSVNDKTsKKwkJYnJlYWs7CiAJfQogCiBtYXBwZWQ6Ci0JaWYgKGRldmljZS0+cXVpcmtzICYgSElEX1FVSVJLX01JR0hUWU1PVVNFKSB7Ci0JCWlmICh1c2FnZS0+aGlkID09IEhJRF9HRF9aKQotCQkJbWFwX3JlbChSRUxfSFdIRUVMKTsKLQkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzEpCi0JCQltYXBfa2V5KEJUTl8yKTsKLQkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzIpCi0JCQltYXBfa2V5KEJUTl8xKTsKLQl9Ci0KLQlpZiAoKGRldmljZS0+cXVpcmtzICYgKEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183IHwgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUgfAotCQkJSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX0I4KSkgJiYgKHVzYWdlLT50eXBlID09IEVWX1JFTCkgJiYKLQkJCSh1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwpKQotCQlzZXRfYml0KFJFTF9IV0hFRUwsIGJpdCk7Ci0KLQlpZiAoKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KSkKLQkJfHwgKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA3KSkpCisJaWYgKGRldmljZS0+ZHJpdmVyLT5pbnB1dF9tYXBwZWQgJiYgZGV2aWNlLT5kcml2ZXItPmlucHV0X21hcHBlZChkZXZpY2UsCisJCQkJaGlkaW5wdXQsIGZpZWxkLCB1c2FnZSwgJmJpdCwgJm1heCkgPCAwKQogCQlnb3RvIGlnbm9yZTsKIAotCWlmICgoZGV2aWNlLT5xdWlya3MgJiBISURfUVVJUktfQkFEX1JFTEFUSVZFX0tFWVMpICYmCi0JCXVzYWdlLT50eXBlID09IEVWX0tFWSAmJiAoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9SRUxBVElWRSkpCi0JCWZpZWxkLT5mbGFncyAmPSB+SElEX01BSU5fSVRFTV9SRUxBVElWRTsKLQogCXNldF9iaXQodXNhZ2UtPnR5cGUsIGlucHV0LT5ldmJpdCk7CiAKLQlpZiAoZGV2aWNlLT5xdWlya3MgJiBISURfUVVJUktfRFVQTElDQVRFX1VTQUdFUyAmJgotCQkJKHVzYWdlLT50eXBlID09IEVWX0tFWSB8fAotCQkJIHVzYWdlLT50eXBlID09IEVWX1JFTCB8fAotCQkJIHVzYWdlLT50eXBlID09IEVWX0FCUykpCi0JCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgYml0KTsKLQogCXdoaWxlICh1c2FnZS0+Y29kZSA8PSBtYXggJiYgdGVzdF9hbmRfc2V0X2JpdCh1c2FnZS0+Y29kZSwgYml0KSkKIAkJdXNhZ2UtPmNvZGUgPSBmaW5kX25leHRfemVyb19iaXQoYml0LCBtYXggKyAxLCB1c2FnZS0+Y29kZSk7CiAKQEAgLTg1OCwxMCArNTg1LDYgQEAKIAlpZiAoIXVzYWdlLT50eXBlKQogCQlyZXR1cm47CiAKLQkvKiBoYW5kbGUgaW5wdXQgZXZlbnRzIGZvciBxdWlya3kgZGV2aWNlcyAqLwotCWlmIChoaWRpbnB1dF9ldmVudF9xdWlya3MoaGlkLCBmaWVsZCwgdXNhZ2UsIHZhbHVlKSkKLQkJcmV0dXJuOwotCiAJaWYgKHVzYWdlLT5oYXRfbWluIDwgdXNhZ2UtPmhhdF9tYXggfHwgdXNhZ2UtPmhhdF9kaXIpIHsKIAkJaW50IGhhdF9kaXIgPSB1c2FnZS0+aGF0X2RpcjsKIAkJaWYgKCFoYXRfZGlyKQpAQCAtOTYxLDE0ICs2ODQsMTQgQEAKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBoaWQtPmhpZF9vcGVuKGhpZCk7CisJcmV0dXJuIGhpZC0+bGxfZHJpdmVyLT5vcGVuKGhpZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhpZGlucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWhpZC0+aGlkX2Nsb3NlKGhpZCk7CisJaGlkLT5sbF9kcml2ZXItPmNsb3NlKGhpZCk7CiB9CiAKIC8qCkBAIC05NzcsNyArNzAwLDcgQEAKICAqIFJlYWQgYWxsIHJlcG9ydHMgYW5kIGluaXRpYWxpemUgdGhlIGFic29sdXRlIGZpZWxkIHZhbHVlcy4KICAqLwogCi1pbnQgaGlkaW5wdXRfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoraW50IGhpZGlucHV0X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IGZvcmNlKQogewogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBOVUxMOwpAQCAtOTg1LDE5ICs3MDgsMjAgQEAKIAlpbnQgaSwgaiwgazsKIAlpbnQgbWF4X3JlcG9ydF90eXBlID0gSElEX09VVFBVVF9SRVBPUlQ7CiAKLQlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfSUdOT1JFX0hJRElOUFVUKQotCQlyZXR1cm4gLTE7Ci0KIAlJTklUX0xJU1RfSEVBRCgmaGlkLT5pbnB1dHMpOwogCi0JZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKQotCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0gSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gfHwKLQkJICAgIGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09IEhJRF9DT0xMRUNUSU9OX1BIWVNJQ0FMKQotCQkJaWYgKElTX0lOUFVUX0FQUExJQ0FUSU9OKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSkpCi0JCQkJYnJlYWs7CisJaWYgKCFmb3JjZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspIHsKKwkJCXN0cnVjdCBoaWRfY29sbGVjdGlvbiAqY29sID0gJmhpZC0+Y29sbGVjdGlvbltpXTsKKwkJCWlmIChjb2wtPnR5cGUgPT0gSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gfHwKKwkJCQkJY29sLT50eXBlID09IEhJRF9DT0xMRUNUSU9OX1BIWVNJQ0FMKQorCQkJCWlmIChJU19JTlBVVF9BUFBMSUNBVElPTihjb2wtPnVzYWdlKSkKKwkJCQkJYnJlYWs7CisJCX0KIAotCWlmIChpID09IGhpZC0+bWF4Y29sbGVjdGlvbiAmJiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfSElESU5QVVQpID09IDApCi0JCXJldHVybiAtMTsKKwkJaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uKQorCQkJcmV0dXJuIC0xOworCX0KIAogCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19TS0lQX09VVFBVVF9SRVBPUlRTKQogCQltYXhfcmVwb3J0X3R5cGUgPSBISURfSU5QVVRfUkVQT1JUOwpAQCAtMTAxOSw3ICs3NDMsOCBAQAogCQkJCX0KIAogCQkJCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgaGlkKTsKLQkJCQlpbnB1dF9kZXYtPmV2ZW50ID0gaGlkLT5oaWRpbnB1dF9pbnB1dF9ldmVudDsKKwkJCQlpbnB1dF9kZXYtPmV2ZW50ID0KKwkJCQkJaGlkLT5sbF9kcml2ZXItPmhpZGlucHV0X2lucHV0X2V2ZW50OwogCQkJCWlucHV0X2Rldi0+b3BlbiA9IGhpZGlucHV0X29wZW47CiAJCQkJaW5wdXRfZGV2LT5jbG9zZSA9IGhpZGlucHV0X2Nsb3NlOwogCQkJCWlucHV0X2Rldi0+c2V0a2V5Y29kZSA9IGhpZGlucHV0X3NldGtleWNvZGU7CkBAIC0xMDMyLDcgKzc1Nyw3IEBACiAJCQkJaW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gaGlkLT52ZW5kb3I7CiAJCQkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gaGlkLT5wcm9kdWN0OwogCQkJCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IGhpZC0+dmVyc2lvbjsKLQkJCQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSBoaWQtPmRldjsKKwkJCQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSBoaWQtPmRldi5wYXJlbnQ7CiAJCQkJaGlkaW5wdXQtPmlucHV0ID0gaW5wdXRfZGV2OwogCQkJCWxpc3RfYWRkX3RhaWwoJmhpZGlucHV0LT5saXN0LCAmaGlkLT5pbnB1dHMpOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZkOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnLmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBsb2dpdGVjaCAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKyNpbmNsdWRlICJoaWQtbGcuaCIKKworI2RlZmluZSBMR19SREVTQwkJMHgwMDEKKyNkZWZpbmUgTEdfQkFEX1JFTEFUSVZFX0tFWVMJMHgwMDIKKyNkZWZpbmUgTEdfRFVQTElDQVRFX1VTQUdFUwkweDAwNAorI2RlZmluZSBMR19SRVNFVF9MRURTCQkweDAwOAorI2RlZmluZSBMR19FWFBBTkRFRF9LRVlNQVAJMHgwMTAKKyNkZWZpbmUgTEdfSUdOT1JFX0RPVUJMRURfV0hFRUwJMHgwMjAKKyNkZWZpbmUgTEdfV0lSRUxFU1MJCTB4MDQwCisjZGVmaW5lIExHX0lOVkVSVF9IV0hFRUwJMHgwODAKKyNkZWZpbmUgTEdfTk9HRVQJCTB4MTAwCisjZGVmaW5lIExHX0ZGCQkJMHgyMDAKKyNkZWZpbmUgTEdfRkYyCQkJMHg0MDAKKworLyoKKyAqIENlcnRhaW4gTG9naXRlY2gga2V5Ym9hcmRzIHNlbmQgaW4gcmVwb3J0ICMzIGtleXMgd2hpY2ggYXJlIGZhcgorICogYWJvdmUgdGhlIGxvZ2ljYWwgbWF4aW11bSBkZXNjcmliZWQgaW4gZGVzY3JpcHRvci4gVGhpcyBleHRlbmRzCisgKiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgMHgyOGMgb2YgbG9naWNhbCBtYXhpbXVtIHRvIDB4MTA0ZAorICovCitzdGF0aWMgdm9pZCBsZ19yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAorCQl1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoKHF1aXJrcyAmIExHX1JERVNDKSAmJiByc2l6ZSA+PSA5MCAmJiByZGVzY1s4M10gPT0gMHgyNiAmJgorCQkJcmRlc2NbODRdID09IDB4OGMgJiYgcmRlc2NbODVdID09IDB4MDIpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBMb2dpdGVjaCBrZXlib2FyZCByZXBvcnQgIgorCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJcmRlc2NbODRdID0gcmRlc2NbODldID0gMHg0ZDsKKwkJcmRlc2NbODVdID0gcmRlc2NbOTBdID0gMHgxMDsKKwl9Cit9CisKKyNkZWZpbmUgbGdfbWFwX2tleV9jbGVhcihjKQloaWRfbWFwX3VzYWdlX2NsZWFyKGhpLCB1c2FnZSwgYml0LCBtYXgsIFwKKwkJRVZfS0VZLCAoYykpCisKK3N0YXRpYyBpbnQgbGdfdWx0cmF4X3JlbW90ZV9tYXBwaW5nKHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9MT0dJVkVORE9SKQorCQlyZXR1cm4gMDsKKworCXNldF9iaXQoRVZfUkVQLCBoaS0+aW5wdXQtPmV2Yml0KTsKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkvKiBSZXBvcnRlZCBvbiBMb2dpdGVjaCBVbHRyYSBYIE1lZGlhIFJlbW90ZSAqLworCWNhc2UgMHgwMDQ6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0FHQUlOKTsJYnJlYWs7CisJY2FzZSAweDAwZDogbGdfbWFwX2tleV9jbGVhcihLRVlfSE9NRSk7CQlicmVhazsKKwljYXNlIDB4MDI0OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9TSFVGRkxFKTsJYnJlYWs7CisJY2FzZSAweDAyNTogbGdfbWFwX2tleV9jbGVhcihLRVlfVFYpOwkJYnJlYWs7CisJY2FzZSAweDAyNjogbGdfbWFwX2tleV9jbGVhcihLRVlfTUVOVSk7CQlicmVhazsKKwljYXNlIDB4MDMxOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9BVURJTyk7CWJyZWFrOworCWNhc2UgMHgwMzI6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1RFWFQpOwkJYnJlYWs7CisJY2FzZSAweDAzMzogbGdfbWFwX2tleV9jbGVhcihLRVlfTEFTVCk7CQlicmVhazsKKwljYXNlIDB4MDQ3OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9NUDMpOwkJYnJlYWs7CisJY2FzZSAweDA0ODogbGdfbWFwX2tleV9jbGVhcihLRVlfRFZEKTsJCWJyZWFrOworCWNhc2UgMHgwNDk6IGxnX21hcF9rZXlfY2xlYXIoS0VZX01FRElBKTsJYnJlYWs7CisJY2FzZSAweDA0YTogbGdfbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwlicmVhazsKKwljYXNlIDB4MDRiOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9BTkdMRSk7CWJyZWFrOworCWNhc2UgMHgwNGM6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0xBTkdVQUdFKTsJYnJlYWs7CisJY2FzZSAweDA0ZDogbGdfbWFwX2tleV9jbGVhcihLRVlfU1VCVElUTEUpOwlicmVhazsKKwljYXNlIDB4MDUxOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9SRUQpOwkJYnJlYWs7CisJY2FzZSAweDA1MjogbGdfbWFwX2tleV9jbGVhcihLRVlfQ0xPU0UpOwlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsZ193aXJlbGVzc19tYXBwaW5nKHN0cnVjdCBoaWRfaW5wdXQgKmhpLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwljYXNlIDB4MTAwMTogbGdfbWFwX2tleV9jbGVhcihLRVlfTUVTU0VOR0VSKTsJCWJyZWFrOworCWNhc2UgMHgxMDAzOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9TT1VORCk7CQlicmVhazsKKwljYXNlIDB4MTAwNDogbGdfbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwkJYnJlYWs7CisJY2FzZSAweDEwMDU6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0FVRElPKTsJCWJyZWFrOworCWNhc2UgMHgxMDBhOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9ET0NVTUVOVFMpOwkJYnJlYWs7CisJY2FzZSAweDEwMTE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1BSRVZJT1VTU09ORyk7CWJyZWFrOworCWNhc2UgMHgxMDEyOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9ORVhUU09ORyk7CQlicmVhazsKKwljYXNlIDB4MTAxMzogbGdfbWFwX2tleV9jbGVhcihLRVlfQ0FNRVJBKTsJCWJyZWFrOworCWNhc2UgMHgxMDE0OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9NRVNTRU5HRVIpOwkJYnJlYWs7CisJY2FzZSAweDEwMTU6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1JFQ09SRCk7CQlicmVhazsKKwljYXNlIDB4MTAxNjogbGdfbWFwX2tleV9jbGVhcihLRVlfUExBWUVSKTsJCWJyZWFrOworCWNhc2UgMHgxMDE3OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9FSkVDVENEKTsJCWJyZWFrOworCWNhc2UgMHgxMDE4OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9NRURJQSk7CQlicmVhazsKKwljYXNlIDB4MTAxOTogbGdfbWFwX2tleV9jbGVhcihLRVlfUFJPRzEpOwkJYnJlYWs7CisJY2FzZSAweDEwMWE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOworCWNhc2UgMHgxMDFiOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9QUk9HMyk7CQlicmVhazsKKwljYXNlIDB4MTAxZjogbGdfbWFwX2tleV9jbGVhcihLRVlfWk9PTUlOKTsJCWJyZWFrOworCWNhc2UgMHgxMDIwOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9aT09NT1VUKTsJCWJyZWFrOworCWNhc2UgMHgxMDIxOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9aT09NUkVTRVQpOwkJYnJlYWs7CisJY2FzZSAweDEwMjM6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0NMT1NFKTsJCWJyZWFrOworCWNhc2UgMHgxMDI3OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9NRU5VKTsJCWJyZWFrOworCS8qIHRoaXMgb25lIGlzIG1hcmtlZCBhcyAnUm90YXRlJyAqLworCWNhc2UgMHgxMDI4OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9BTkdMRSk7CQlicmVhazsKKwljYXNlIDB4MTAyOTogbGdfbWFwX2tleV9jbGVhcihLRVlfU0hVRkZMRSk7CQlicmVhazsKKwljYXNlIDB4MTAyYTogbGdfbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CQlicmVhazsKKwljYXNlIDB4MTAyYjogbGdfbWFwX2tleV9jbGVhcihLRVlfQ1lDTEVXSU5ET1dTKTsJYnJlYWs7CisJY2FzZSAweDEwNDE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0JBVFRFUlkpOwkJYnJlYWs7CisJY2FzZSAweDEwNDI6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1dPUkRQUk9DRVNTT1IpOwlicmVhazsKKwljYXNlIDB4MTA0MzogbGdfbWFwX2tleV9jbGVhcihLRVlfU1BSRUFEU0hFRVQpOwkJYnJlYWs7CisJY2FzZSAweDEwNDQ6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1BSRVNFTlRBVElPTik7CWJyZWFrOworCWNhc2UgMHgxMDQ1OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9VTkRPKTsJCWJyZWFrOworCWNhc2UgMHgxMDQ2OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9SRURPKTsJCWJyZWFrOworCWNhc2UgMHgxMDQ3OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9QUklOVCk7CQlicmVhazsKKwljYXNlIDB4MTA0ODogbGdfbWFwX2tleV9jbGVhcihLRVlfU0FWRSk7CQlicmVhazsKKwljYXNlIDB4MTA0OTogbGdfbWFwX2tleV9jbGVhcihLRVlfUFJPRzEpOwkJYnJlYWs7CisJY2FzZSAweDEwNGE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOworCWNhc2UgMHgxMDRiOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9QUk9HMyk7CQlicmVhazsKKwljYXNlIDB4MTA0YzogbGdfbWFwX2tleV9jbGVhcihLRVlfUFJPRzQpOwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbGdfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJLyogZXh0ZW5kZWQgbWFwcGluZyBmb3IgY2VydGFpbiBMb2dpdGVjaCBoYXJkd2FyZSAoTG9naXRlY2ggY29yZGxlc3MKKwkgICBkZXNrdG9wIExYNTAwKSAqLworCXN0YXRpYyBjb25zdCB1OCBlX2tleW1hcFtdID0geworCQkgIDAsMjE2LCAgMCwyMTMsMTc1LDE1NiwgIDAsICAwLCAgMCwgIDAsCisJCTE0NCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLDIxMiwKKwkJMTc0LDE2NywxNTIsMTYxLDExMiwgIDAsICAwLCAgMCwxNTQsICAwLAorCQkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkJICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCQkgIDAsICAwLCAgMCwgIDAsICAwLDE4MywxODQsMTg1LDE4NiwxODcsCisJCTE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwgIDAsICAwLCAgMAorCX07CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisJdW5zaWduZWQgaW50IGhpZCA9IHVzYWdlLT5oaWQ7CisKKwlpZiAoaGRldi0+cHJvZHVjdCA9PSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JFQ0VJVkVSICYmCisJCQlsZ191bHRyYXhfcmVtb3RlX21hcHBpbmcoaGksIHVzYWdlLCBiaXQsIG1heCkpCisJCXJldHVybiAxOworCisJaWYgKChxdWlya3MgJiBMR19XSVJFTEVTUykgJiYgbGdfd2lyZWxlc3NfbWFwcGluZyhoaSwgdXNhZ2UsIGJpdCwgbWF4KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfQlVUVE9OKQorCQlyZXR1cm4gMDsKKworCWhpZCAmPSBISURfVVNBR0U7CisKKwkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBMb2dpdGVjaCBDb3JkbGVzcyBEZXNrdG9wICovCisJaWYgKGZpZWxkLT5hcHBsaWNhdGlvbiA9PSBISURfR0RfTU9VU0UpIHsKKwkJaWYgKChxdWlya3MgJiBMR19JR05PUkVfRE9VQkxFRF9XSEVFTCkgJiYKKwkJCQkoaGlkID09IDcgfHwgaGlkID09IDgpKQorCQkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCWlmICgocXVpcmtzICYgTEdfRVhQQU5ERURfS0VZTUFQKSAmJgorCQkJCWhpZCA8IEFSUkFZX1NJWkUoZV9rZXltYXApICYmCisJCQkJZV9rZXltYXBbaGlkXSAhPSAwKSB7CisJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsIEVWX0tFWSwKKwkJCQkJZV9rZXltYXBbaGlkXSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnX2lucHV0X21hcHBlZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoKHF1aXJrcyAmIExHX0JBRF9SRUxBVElWRV9LRVlTKSAmJiB1c2FnZS0+dHlwZSA9PSBFVl9LRVkgJiYKKwkJCShmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKSkKKwkJZmllbGQtPmZsYWdzICY9IH5ISURfTUFJTl9JVEVNX1JFTEFUSVZFOworCisJaWYgKChxdWlya3MgJiBMR19EVVBMSUNBVEVfVVNBR0VTKSAmJiAodXNhZ2UtPnR5cGUgPT0gRVZfS0VZIHx8CisJCQkgdXNhZ2UtPnR5cGUgPT0gRVZfUkVMIHx8IHVzYWdlLT50eXBlID09IEVWX0FCUykpCisJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgKmJpdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICgocXVpcmtzICYgTEdfSU5WRVJUX0hXSEVFTCkgJiYgdXNhZ2UtPmNvZGUgPT0gUkVMX0hXSEVFTCkgeworCQlpbnB1dF9ldmVudChmaWVsZC0+aGlkaW5wdXQtPmlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsCisJCQkJLXZhbHVlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9IGlkLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgY29ubmVjdF9tYXNrID0gSElEX0NPTk5FQ1RfREVGQVVMVDsKKwlpbnQgcmV0OworCisJaGlkX3NldF9kcnZkYXRhKGhkZXYsICh2b2lkICopcXVpcmtzKTsKKworCWlmIChxdWlya3MgJiBMR19OT0dFVCkKKwkJaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT0dFVDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJaWYgKHF1aXJrcyAmIChMR19GRiB8IExHX0ZGMikpCisJCWNvbm5lY3RfbWFzayAmPSB+SElEX0NPTk5FQ1RfRkY7CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgY29ubmVjdF9tYXNrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJaWYgKHF1aXJrcyAmIExHX1JFU0VUX0xFRFMpCisJCXVzYmhpZF9zZXRfbGVkcyhoZGV2KTsKKworCWlmIChxdWlya3MgJiBMR19GRikKKwkJbGdmZl9pbml0KGhkZXYpOworCWlmIChxdWlya3MgJiBMR19GRjIpCisJCWxnMmZmX2luaXQoaGRldik7CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBsZ19kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX01YMzAwMF9SRUNFSVZFUiksCisJCS5kcml2ZXJfZGF0YSA9IExHX1JERVNDIHwgTEdfV0lSRUxFU1MgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUiksCisJCS5kcml2ZXJfZGF0YSA9IExHX1JERVNDIHwgTEdfV0lSRUxFU1MgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfUkRFU0MgfCBMR19XSVJFTEVTUyB9LAorCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JFQ0VJVkVSKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfQkFEX1JFTEFUSVZFX0tFWVMgfSwKKworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fREVTS1RPUCksCisJCS5kcml2ZXJfZGF0YSA9IExHX0RVUExJQ0FURV9VU0FHRVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX0VER0UpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19EVVBMSUNBVEVfVVNBR0VTIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19NSU5JKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfRFVQTElDQVRFX1VTQUdFUyB9LAorCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0tCRCksCisJCS5kcml2ZXJfZGF0YSA9IExHX1JFU0VUX0xFRFMgfSwKKworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FTElURV9LQkQpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19JR05PUkVfRE9VQkxFRF9XSEVFTCB8IExHX0VYUEFOREVEX0tFWU1BUCB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9DT1JETEVTU19ERVNLVE9QX0xYNTAwKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfSUdOT1JFX0RPVUJMRURfV0hFRUwgfCBMR19FWFBBTkRFRF9LRVlNQVAgfSwKKworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9MWDMpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19JTlZFUlRfSFdIRUVMIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1YxNTApLAorCQkuZHJpdmVyX2RhdGEgPSBMR19JTlZFUlRfSFdIRUVMIH0sCisKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRVhUUkVNRV8zRCksCisJCS5kcml2ZXJfZGF0YSA9IExHX05PR0VUIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfTk9HRVQgfCBMR19GRiB9LAorCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRCksCisJCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDJfMiksCisJCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dJTkdNQU5fRjNEKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfRkYgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRk9SQ0UzRF9QUk8pLAorCQkuZHJpdmVyX2RhdGEgPSBMR19GRiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT01PX1dIRUVMKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfRkYgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9NT19XSEVFTDIpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19GRiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SVU1CTEVQQUQyKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfRkYyIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGxnX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgbGdfZHJpdmVyID0geworCS5uYW1lID0gImxvZ2l0ZWNoIiwKKwkuaWRfdGFibGUgPSBsZ19kZXZpY2VzLAorCS5yZXBvcnRfZml4dXAgPSBsZ19yZXBvcnRfZml4dXAsCisJLmlucHV0X21hcHBpbmcgPSBsZ19pbnB1dF9tYXBwaW5nLAorCS5pbnB1dF9tYXBwZWQgPSBsZ19pbnB1dF9tYXBwZWQsCisJLmV2ZW50ID0gbGdfZXZlbnQsCisJLnByb2JlID0gbGdfcHJvYmUsCit9OworCitzdGF0aWMgaW50IGxnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmbGdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgbGdfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmbGdfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobGdfaW5pdCk7Cittb2R1bGVfZXhpdChsZ19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihsb2dpdGVjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbGcuaCBiL2RyaXZlcnMvaGlkL2hpZC1sZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWU3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9fSElEX0xHX0gKKyNkZWZpbmUgX19ISURfTEdfSAorCisjaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4KKworI2lmZGVmIENPTkZJR19MT0dJVEVDSF9GRgoraW50IGxnZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbGdmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KSB7IHJldHVybiAtMTsgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYKK2ludCBsZzJmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBsZzJmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KSB7IHJldHVybiAtMTsgfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1sZzJmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1sZzJmZi5jCnJlbmFtZSB0byBkcml2ZXJzL2hpZC9oaWQtbGcyZmYuYwppbmRleCBkNDY5YmQwLi40ZTZkYzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWxnMmZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMKQEAgLTI0LDcgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgotI2luY2x1ZGUgInVzYmhpZC5oIgorCisjaW5jbHVkZSAidXNiaGlkL3VzYmhpZC5oIgorI2luY2x1ZGUgImhpZC1sZy5oIgogCiBzdHJ1Y3QgbGcyZmZfZGV2aWNlIHsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwpAQCAtNTcsNyArNTksNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaGlkX2xnMmZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK2ludCBsZzJmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7CiAJc3RydWN0IGxnMmZmX2RldmljZSAqbGcyZmY7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKQEAgLTY5LDE4ICs3MSwxOCBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1sZzJmZjogbm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1sZzJmZjogb3V0cHV0IHJlcG9ydCBpcyBlbXB0eVxuIik7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAib3V0cHV0IHJlcG9ydCBpcyBlbXB0eVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAocmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50IDwgNykgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1sZzJmZjogbm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEwNyw3ICsxMDksNyBAQAogCiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBSdW1ibGVwYWQgMiBieSAiCisJZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIFJ1bWJsZXBhZCAyIGJ5ICIKIAkgICAgICAgIkFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtbGdmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnZmYuYwpzaW1pbGFyaXR5IGluZGV4IDgxJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2hpZC91c2JoaWQvaGlkLWxnZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvaGlkLWxnZmYuYwppbmRleCA0YjdhYjZhLi41MWFmZjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWxnZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGdmZi5jCkBAIC0zMCw3ICszMCw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlICJ1c2JoaWQuaCIKKworI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKKyNpbmNsdWRlICJoaWQtbGcuaCIKIAogc3RydWN0IGRldl90eXBlIHsKIAl1MTYgaWRWZW5kb3I7CkBAIC00OCw2ICs1MCwxMiBAQAogCS0xCiB9OwogCitzdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IGZmX3doZWVsW10gPSB7CisJRkZfQ09OU1RBTlQsCisJRkZfQVVUT0NFTlRFUiwKKwktMQorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfdHlwZSBkZXZpY2VzW10gPSB7CiAJeyAweDA0NmQsIDB4YzIxMSwgZmZfcnVtYmxlIH0sCiAJeyAweDA0NmQsIDB4YzIxOSwgZmZfcnVtYmxlIH0sCkBAIC01NSw3ICs2Myw3IEBACiAJeyAweDA0NmQsIDB4YzI4NiwgZmZfam95c3RpY2sgfSwKIAl7IDB4MDQ2ZCwgMHhjMjk0LCBmZl9qb3lzdGljayB9LAogCXsgMHgwNDZkLCAweGMyOTUsIGZmX2pveXN0aWNrIH0sCi0JeyAweDA0NmQsIDB4Y2EwMywgZmZfam95c3RpY2sgfSwKKwl7IDB4MDQ2ZCwgMHhjYTAzLCBmZl93aGVlbCB9LAogfTsKIAogc3RhdGljIGludCBoaWRfbGdmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQpAQCAtMTAwLDcgKzEwOCwyNCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaGlkX2xnZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSogaGlkKQorc3RhdGljIHZvaWQgaGlkX2xnZmZfc2V0X2F1dG9jZW50ZXIoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1MTYgbWFnbml0dWRlKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0gJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CisJX19zMzIgKnZhbHVlID0gcmVwb3J0LT5maWVsZFswXS0+dmFsdWU7CisJbWFnbml0dWRlID0gKG1hZ25pdHVkZSA+PiAxMikgJiAweGY7CisJKnZhbHVlKysgPSAweGZlOworCSp2YWx1ZSsrID0gMHgwZDsKKwkqdmFsdWUrKyA9IG1hZ25pdHVkZTsgICAvKiBjbG9ja3dpc2Ugc3RyZW5ndGggKi8KKwkqdmFsdWUrKyA9IG1hZ25pdHVkZTsgICAvKiBjb3VudGVyLWNsb2Nrd2lzZSBzdHJlbmd0aCAqLworCSp2YWx1ZSsrID0gMHg4MDsKKwkqdmFsdWUrKyA9IDB4MDA7CisJKnZhbHVlID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOworfQorCitpbnQgbGdmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlKiBoaWQpCiB7CiAJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBsaXN0X2VudHJ5KGhpZC0+aW5wdXRzLm5leHQsIHN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0gJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OwpAQCAtMTQ1LDYgKzE3MCw5IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKKwlpZiAoIHRlc3RfYml0KEZGX0FVVE9DRU5URVIsIGRldi0+ZmZiaXQpICkKKwkJZGV2LT5mZi0+c2V0X2F1dG9jZW50ZXIgPSBoaWRfbGdmZl9zZXRfYXV0b2NlbnRlcjsKKwogCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBmb3JjZSBmZWVkYmFjayBkZXZpY2VzIGJ5IEpvaGFubiBEZW5ldXggPGpvaGFubi5kZW5ldXhAaXQudXUuc2U+XG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jIGIvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MThiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBtaWNyb3NvZnQgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2RlZmluZSBNU19ISURJTlBVVAkweDAxCisjZGVmaW5lIE1TX0VSR09OT01ZCTB4MDIKKyNkZWZpbmUgTVNfUFJFU0VOVEVSCTB4MDQKKyNkZWZpbmUgTVNfUkRFU0MJMHgwOAorI2RlZmluZSBNU19OT0dFVAkweDEwCisKKy8qCisgKiBNaWNyb3NvZnQgV2lyZWxlc3MgRGVza3RvcCBSZWNlaXZlciAoTW9kZWwgMTAyOCkgaGFzIHNldmVyYWwKKyAqICdVc2FnZSBNaW4vTWF4JyB3aGVyZSBpdCBvdWdodCB0byBoYXZlICdQaHlzaWNhbCBNaW4vTWF4JworICovCitzdGF0aWMgdm9pZCBtc19yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAorCQl1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoKHF1aXJrcyAmIE1TX1JERVNDKSAmJiByc2l6ZSA9PSA1NzEgJiYgcmRlc2NbMjg0XSA9PSAweDE5ICYmCisJCQlyZGVzY1syODZdID09IDB4MmEgJiYgcmRlc2NbMzA0XSA9PSAweDE5ICYmCisJCQlyZGVzY1szMDZdID09IDB4MjkgJiYgcmRlc2NbMzUyXSA9PSAweDFhICYmCisJCQlyZGVzY1szNTVdID09IDB4MmEgJiYgcmRlc2NbNTU3XSA9PSAweDE5ICYmCisJCQlyZGVzY1s1NTldID09IDB4MjkpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBNaWNyb3NvZnQgV2lyZWxlc3MgUmVjZWl2ZXIgIgorCQkJCSJNb2RlbCAxMDI4IHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKKwkJcmRlc2NbMjg0XSA9IHJkZXNjWzMwNF0gPSByZGVzY1s1NTddID0gMHgzNTsKKwkJcmRlc2NbMzUyXSA9IDB4MzY7CisJCXJkZXNjWzI4Nl0gPSByZGVzY1szNTVdID0gMHg0NjsKKwkJcmRlc2NbMzA2XSA9IHJkZXNjWzU1OV0gPSAweDQ1OworCX0KK30KKworI2RlZmluZSBtc19tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgbXNfZXJnb25vbXlfa2JfcXVpcmsoc3RydWN0IGhpZF9pbnB1dCAqaGksIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGhpLT5pbnB1dDsKKworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCWNhc2UgMHhmZDA2OiBtc19tYXBfa2V5X2NsZWFyKEtFWV9DSEFUKTsJYnJlYWs7CisJY2FzZSAweGZkMDc6IG1zX21hcF9rZXlfY2xlYXIoS0VZX1BIT05FKTsJYnJlYWs7CisJY2FzZSAweGZmMDU6CisJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQltc19tYXBfa2V5X2NsZWFyKEtFWV9GMTMpOworCQlzZXRfYml0KEtFWV9GMTQsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTUsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTYsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTcsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTgsIGlucHV0LT5rZXliaXQpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc19wcmVzZW50ZXJfOGtfcXVpcmsoc3RydWN0IGhpZF9pbnB1dCAqaGksIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlzZXRfYml0KEVWX1JFUCwgaGktPmlucHV0LT5ldmJpdCk7CisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJY2FzZSAweGZkMDg6IG1zX21hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkQpOwlicmVhazsKKwljYXNlIDB4ZmQwOTogbXNfbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CWJyZWFrOworCWNhc2UgMHhmZDBiOiBtc19tYXBfa2V5X2NsZWFyKEtFWV9QTEFZUEFVU0UpOwlicmVhazsKKwljYXNlIDB4ZmQwZTogbXNfbWFwX2tleV9jbGVhcihLRVlfQ0xPU0UpOwlicmVhazsKKwljYXNlIDB4ZmQwZjogbXNfbWFwX2tleV9jbGVhcihLRVlfUExBWSk7CWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc19pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTVNWRU5ET1IpCisJCXJldHVybiAwOworCisJaWYgKHF1aXJrcyAmIE1TX0VSR09OT01ZKSB7CisJCWludCByZXQgPSBtc19lcmdvbm9teV9rYl9xdWlyayhoaSwgdXNhZ2UsIGJpdCwgbWF4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKChxdWlya3MgJiBNU19QUkVTRU5URVIpICYmCisJCQltc19wcmVzZW50ZXJfOGtfcXVpcmsoaGksIHVzYWdlLCBiaXQsIG1heCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoIShoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpIHx8ICFmaWVsZC0+aGlkaW5wdXQgfHwKKwkJCSF1c2FnZS0+dHlwZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBIYW5kbGluZyBNUyBrZXlib2FyZHMgc3BlY2lhbCBidXR0b25zICovCisJaWYgKHF1aXJrcyAmIE1TX0VSR09OT01ZICYmIHVzYWdlLT5oaWQgPT0gKEhJRF9VUF9NU1ZFTkRPUiB8IDB4ZmYwNSkpIHsKKwkJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBmaWVsZC0+aGlkaW5wdXQtPmlucHV0OworCQlzdGF0aWMgdW5zaWduZWQgaW50IGxhc3Rfa2V5ID0gMDsKKwkJdW5zaWduZWQgaW50IGtleSA9IDA7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJY2FzZSAweDAxOiBrZXkgPSBLRVlfRjE0OyBicmVhazsKKwkJY2FzZSAweDAyOiBrZXkgPSBLRVlfRjE1OyBicmVhazsKKwkJY2FzZSAweDA0OiBrZXkgPSBLRVlfRjE2OyBicmVhazsKKwkJY2FzZSAweDA4OiBrZXkgPSBLRVlfRjE3OyBicmVhazsKKwkJY2FzZSAweDEwOiBrZXkgPSBLRVlfRjE4OyBicmVhazsKKwkJfQorCQlpZiAoa2V5KSB7CisJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIGtleSwgMSk7CisJCQlsYXN0X2tleSA9IGtleTsKKwkJfSBlbHNlCisJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIGxhc3Rfa2V5LCAwKTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc19wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGxvbmcgcXVpcmtzID0gaWQtPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwloaWRfc2V0X2RydmRhdGEoaGRldiwgKHZvaWQgKilxdWlya3MpOworCisJaWYgKHF1aXJrcyAmIE1TX05PR0VUKQorCQloZGV2LT5xdWlya3MgfD0gSElEX1FVSVJLX05PR0VUOworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCB8ICgocXVpcmtzICYgTVNfSElESU5QVVQpID8KKwkJCQlISURfQ09OTkVDVF9ISURJTlBVVF9GT1JDRSA6IDApKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgbXNfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfU0lERVdJTkRFUl9HViksCisJCS5kcml2ZXJfZGF0YSA9IE1TX0hJRElOUFVUIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19ORTRLKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfRVJHT05PTVkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0xLNkspLAorCQkuZHJpdmVyX2RhdGEgPSBNU19FUkdPTk9NWSB8IE1TX1JERVNDIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19QUkVTRU5URVJfOEtfVVNCKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfUFJFU0VOVEVSIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfTk9HRVQgfSwKKworCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX0JUKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfUFJFU0VOVEVSIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIG1zX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgbXNfZHJpdmVyID0geworCS5uYW1lID0gIm1pY3Jvc29mdCIsCisJLmlkX3RhYmxlID0gbXNfZGV2aWNlcywKKwkucmVwb3J0X2ZpeHVwID0gbXNfcmVwb3J0X2ZpeHVwLAorCS5pbnB1dF9tYXBwaW5nID0gbXNfaW5wdXRfbWFwcGluZywKKwkuZXZlbnQgPSBtc19ldmVudCwKKwkucHJvYmUgPSBtc19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgbXNfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZtc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBtc19leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZtc19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtc19pbml0KTsKK21vZHVsZV9leGl0KG1zX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKG1pY3Jvc29mdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbW9udGVyZXkuYyBiL2RyaXZlcnMvaGlkL2hpZC1tb250ZXJleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTg1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbW9udGVyZXkuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgbW9udGVyZXkgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKK3N0YXRpYyB2b2lkIG1yX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gMzAgJiYgcmRlc2NbMjldID09IDB4MDUgJiYgcmRlc2NbMzBdID09IDB4MDkpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBidXR0b24vY29uc3VtZXIgaW4gSElEIHJlcG9ydCAiCisJCQkJImRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1szMF0gPSAweDBjOworCX0KK30KKworI2RlZmluZSBtcl9tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgbXJfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwljYXNlIDB4MTU2OiBtcl9tYXBfa2V5X2NsZWFyKEtFWV9XT1JEUFJPQ0VTU09SKTsJYnJlYWs7CisJY2FzZSAweDE1NzogbXJfbWFwX2tleV9jbGVhcihLRVlfU1BSRUFEU0hFRVQpOwkJYnJlYWs7CisJY2FzZSAweDE1ODogbXJfbWFwX2tleV9jbGVhcihLRVlfUFJFU0VOVEFUSU9OKTsJCWJyZWFrOworCWNhc2UgMHgxNWM6IG1yX21hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIG1yX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9OVEVSRVksIFVTQl9ERVZJQ0VfSURfR0VOSVVTX0tCMjlFKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBtcl9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIG1yX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtb250ZXJleSIsCisJLmlkX3RhYmxlID0gbXJfZGV2aWNlcywKKwkucmVwb3J0X2ZpeHVwID0gbXJfcmVwb3J0X2ZpeHVwLAorCS5pbnB1dF9tYXBwaW5nID0gbXJfaW5wdXRfbWFwcGluZywKK307CisKK3N0YXRpYyBpbnQgbXJfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZtcl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBtcl9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZtcl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtcl9pbml0KTsKK21vZHVsZV9leGl0KG1yX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKG1vbnRlcmV5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1wZXRhbHlueC5jIGIvZHJpdmVycy9oaWQvaGlkLXBldGFseW54LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5NDVmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1wZXRhbHlueC5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgcGV0YWx5bnggInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKy8qIFBldGFseW54IE1heHRlciBSZW1vdGUgaGFzIG1heGltdW0gZm9yIGNvbnN1bWVyIHBhZ2Ugc2V0IHRvbyBsb3cgKi8KK3N0YXRpYyB2b2lkIHBsX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gNjAgJiYgcmRlc2NbMzldID09IDB4MmEgJiYgcmRlc2NbNDBdID09IDB4ZjUgJiYKKwkJCXJkZXNjWzQxXSA9PSAweDAwICYmIHJkZXNjWzU5XSA9PSAweDI2ICYmCisJCQlyZGVzY1s2MF0gPT0gMHhmOSAmJiByZGVzY1s2MV0gPT0gMHgwMCkgeworCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFBldGFseW54IE1heHRlciBSZW1vdGUgcmVwb3J0ICIKKwkJCQkiZGVzY3JpcHRvclxuIik7CisJCXJkZXNjWzYwXSA9IDB4ZmE7CisJCXJkZXNjWzQwXSA9IDB4ZmE7CisJfQorfQorCisjZGVmaW5lIHBsX21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorc3RhdGljIGludCBwbF9pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0xPR0lWRU5ET1IpIHsKKwkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCWNhc2UgMHgwNWE6IHBsX21hcF9rZXlfY2xlYXIoS0VZX1RFWFQpOwkJYnJlYWs7CisJCWNhc2UgMHgwNWI6IHBsX21hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKKwkJY2FzZSAweDA1YzogcGxfbWFwX2tleV9jbGVhcihLRVlfR1JFRU4pOwlicmVhazsKKwkJY2FzZSAweDA1ZDogcGxfbWFwX2tleV9jbGVhcihLRVlfWUVMTE9XKTsJYnJlYWs7CisJCWNhc2UgMHgwNWU6IHBsX21hcF9rZXlfY2xlYXIoS0VZX0JMVUUpOwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0NPTlNVTUVSKSB7CisJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCQljYXNlIDB4MGY2OiBwbF9tYXBfa2V5X2NsZWFyKEtFWV9ORVhUKTsJCWJyZWFrOworCQljYXNlIDB4MGZhOiBwbF9tYXBfa2V5X2NsZWFyKEtFWV9CQUNLKTsJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGxfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT0dFVDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBwbF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BFVEFMWU5YLCBVU0JfREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHBsX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgcGxfZHJpdmVyID0geworCS5uYW1lID0gInBldGFseW54IiwKKwkuaWRfdGFibGUgPSBwbF9kZXZpY2VzLAorCS5yZXBvcnRfZml4dXAgPSBwbF9yZXBvcnRfZml4dXAsCisJLmlucHV0X21hcHBpbmcgPSBwbF9pbnB1dF9tYXBwaW5nLAorCS5wcm9iZSA9IHBsX3Byb2JlLAorfTsKKworc3RhdGljIGludCBwbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnBsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBsX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBsX2luaXQpOworbW9kdWxlX2V4aXQocGxfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIocGV0YWx5bngpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1wbGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtcGwuYwpzaW1pbGFyaXR5IGluZGV4IDY4JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBsZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvaGlkLXBsLmMKaW5kZXggOWViODNjZi4uYWNkODE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1wbGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKQEAgLTksNyArOSw3IEBACiAgKiAgIC0gY29udGFpbnMgdHdvIHJlcG9ydHMsIG9uZSBmb3IgZWFjaCBwb3J0IChISURfUVVJUktfTVVMVElfSU5QVVQpCiAgKgogICogIDBlOGY6MDAwMyAiR3JlZW5Bc2lhIEluYy4gICAgVVNCIEpveXN0aWNrICAgICAiCi0gKiAgIC0gdGVzdGVkIHdpdGggS8O2bmcgR2FtaW5nIGdhbWVwYWQKKyAqICAgLSB0ZXN0ZWQgd2l0aCBLPz9uZyBHYW1pbmcgZ2FtZXBhZAogICoKICAqICBDb3B5cmlnaHQgKGMpIDIwMDcgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+CiAgKi8KQEAgLTM4LDcgKzM4LDExIEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlICJ1c2JoaWQuaCIKKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2lmZGVmIENPTkZJR19QQU5USEVSTE9SRF9GRgorI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKIAogc3RydWN0IHBsZmZfZGV2aWNlIHsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwpAQCAtNjYsNyArNzAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaGlkX3BsZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQorc3RhdGljIGludCBwbGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlzdHJ1Y3QgcGxmZl9kZXZpY2UgKnBsZmY7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKQEAgLTg2LDcgKzkwLDcgQEAKIAkgICBjdXJyZW50bHkgdW5rbm93bi4gKi8KIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1wbGZmOiBubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTk1LDE4ICs5OSwxOSBAQAogCQlyZXBvcnRfcHRyID0gcmVwb3J0X3B0ci0+bmV4dDsKIAogCQlpZiAocmVwb3J0X3B0ciA9PSByZXBvcnRfbGlzdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGxmZjogcmVxdWlyZWQgb3V0cHV0IHJlcG9ydCBpcyBtaXNzaW5nXG4iKTsKKwkJCWRldl9lcnIoJmhpZC0+ZGV2LCAicmVxdWlyZWQgb3V0cHV0IHJlcG9ydCBpcyAiCisJCQkJCSJtaXNzaW5nXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKIAkJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfcHRyLCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAJCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGxmZjogbm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOworCQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCiAJCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImhpZC1wbGZmOiBub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIApAQCAtMTMyLDggKzEzNyw3MCBAQAogCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBsZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gImhpZC1wbGZmOiBGb3JjZSBmZWVkYmFjayBmb3IgUGFudGhlckxvcmQvR3JlZW5Bc2lhICIKKwlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBmZWVkYmFjayBmb3IgUGFudGhlckxvcmQvR3JlZW5Bc2lhICIKIAkgICAgICAgImRldmljZXMgYnkgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKIAogCXJldHVybiAwOwogfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHBsZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGxfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGlkLT5kcml2ZXJfZGF0YSkKKwkJaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19NVUxUSV9JTlBVVDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXBsZmZfaW5pdChoZGV2KTsKKworCXJldHVybiAwOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBwbF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dBTUVST04sIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BTWF9BREFQVE9SKSwKKwkJLmRyaXZlcl9kYXRhID0gMSB9LCAvKiBUd2luIFVTQiBKb3lzdGljayAqLworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HUkVFTkFTSUEsIDB4MDAwMyksIH0sIC8qIEdyZWVuQXNpYSBJbmMuIFVTQiBKb3lzdGljayAqLworCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBwbF9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIHBsX2RyaXZlciA9IHsKKwkubmFtZSA9ICJwYW50aGVybG9yZCIsCisJLmlkX3RhYmxlID0gcGxfZGV2aWNlcywKKwkucHJvYmUgPSBwbF9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgcGxfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZwbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBwbF9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZwbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwbF9pbml0KTsKK21vZHVsZV9leGl0KHBsX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKHBhbnRoZXJsb3JkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zYW1zdW5nLmMgYi9kcml2ZXJzL2hpZC9oaWQtc2Ftc3VuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjNjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtc2Ftc3VuZy5jCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgc2Ftc3VuZyAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworLyoKKyAqIFNhbXN1bmcgSXJEQSByZW1vdGUgY29udHJvbGxlciAocmVwb3J0cyBhcyBDeXByZXNzIFVTQiBNb3VzZSkuCisgKgorICogVmVuZG9yIHNwZWNpZmljIHJlcG9ydCAjNCBoYXMgYSBzaXplIG9mIDQ4IGJpdCwKKyAqIGFuZCB0aGVyZWZvcmUgaXMgbm90IGFjY2VwdGVkIHdoZW4gaW5zcGVjdGluZyB0aGUgZGVzY3JpcHRvcnMuCisgKiBBcyBhIHdvcmthcm91bmQgd2UgcmVpbnRlcnByZXQgdGhlIHJlcG9ydCBhczoKKyAqICAgVmFyaWFibGUgdHlwZSwgY291bnQgNiwgc2l6ZSA4IGJpdCwgbG9nLiBtYXhpbXVtIDI1NQorICogVGhlIGJ1cmRlbiB0byByZWNvbnN0cnVjdCB0aGUgZGF0YSBpcyBtb3ZlZCBpbnRvIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyB2b2lkIHNhbXN1bmdfcmVwb3J0X2ZpeHVwKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpyZGVzYywKKwkJdW5zaWduZWQgaW50IHJzaXplKQoreworCWlmIChyc2l6ZSA+PSAxODIgJiYgcmRlc2NbMTc1XSA9PSAweDI1ICYmIHJkZXNjWzE3Nl0gPT0gMHg0MCAmJgorCQkJcmRlc2NbMTc3XSA9PSAweDc1ICYmIHJkZXNjWzE3OF0gPT0gMHgzMCAmJgorCQkJcmRlc2NbMTc5XSA9PSAweDk1ICYmIHJkZXNjWzE4MF0gPT0gMHgwMSAmJgorCQkJcmRlc2NbMTgyXSA9PSAweDQwKSB7CisJCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgU2Ftc3VuZyBJckRBIHJlcG9ydCAiCisJCQkJImRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1sxNzZdID0gMHhmZjsKKwkJcmRlc2NbMTc4XSA9IDB4MDg7CisJCXJkZXNjWzE4MF0gPSAweDA2OworCQlyZGVzY1sxODJdID0gMHg0MjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCAoSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9ISURJTlBVVCkgfAorCQkJSElEX0NPTk5FQ1RfSElEREVWX0ZPUkNFKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgc2Ftc3VuZ19kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NBTVNVTkcsIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19JUl9SRU1PVEUpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHNhbXN1bmdfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBzYW1zdW5nX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzYW1zdW5nIiwKKwkuaWRfdGFibGUgPSBzYW1zdW5nX2RldmljZXMsCisJLnJlcG9ydF9maXh1cCA9IHNhbXN1bmdfcmVwb3J0X2ZpeHVwLAorCS5wcm9iZSA9IHNhbXN1bmdfcHJvYmUsCit9OworCitzdGF0aWMgaW50IHNhbXN1bmdfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZzYW1zdW5nX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmc2Ftc3VuZ19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzYW1zdW5nX2luaXQpOworbW9kdWxlX2V4aXQoc2Ftc3VuZ19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihzYW1zdW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZjgwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgc29ueSAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworLyoKKyAqIFNlbmRpbmcgSElEX1JFUV9HRVRfUkVQT1JUIGNoYW5nZXMgdGhlIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBwczMgY29udHJvbGxlcgorICogdG8gIm9wZXJhdGlvbmFsIi4gIFdpdGhvdXQgdGhpcywgdGhlIHBzMyBjb250cm9sbGVyIHdpbGwgbm90IHJlcG9ydCBhbnkKKyAqIGV2ZW50cy4KKyAqLworc3RhdGljIGludCBzb255X3NldF9vcGVyYXRpb25hbChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJX191MTYgaWZudW0gPSBpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCWludCByZXQ7CisJY2hhciAqYnVmID0ga21hbGxvYygxOCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKKwkJCQkgSElEX1JFUV9HRVRfUkVQT1JULAorCQkJCSBVU0JfRElSX0lOIHwgVVNCX1RZUEVfQ0xBU1MgfAorCQkJCSBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCSAoMyA8PCA4KSB8IDB4ZjIsIGlmbnVtLCBidWYsIDE3LAorCQkJCSBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IHNldCBvcGVyYXRpb25hbCBtb2RlXG4iKTsKKworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNvbnlfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCB8CisJCQlISURfQ09OTkVDVF9ISURERVZfRk9SQ0UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBzb255X3NldF9vcGVyYXRpb25hbChoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9zdG9wOworCisJcmV0dXJuIDA7CitlcnJfc3RvcDoKKwloaWRfaHdfc3RvcChoZGV2KTsKK2Vycl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBzb255X2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU09OWSwgVVNCX0RFVklDRV9JRF9TT05ZX1BTM19DT05UUk9MTEVSKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBzb255X2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgc29ueV9kcml2ZXIgPSB7CisJLm5hbWUgPSAic29ueSIsCisJLmlkX3RhYmxlID0gc29ueV9kZXZpY2VzLAorCS5wcm9iZSA9IHNvbnlfcHJvYmUsCit9OworCitzdGF0aWMgaW50IHNvbnlfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZzb255X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNvbnlfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzb255X2luaXQpOworbW9kdWxlX2V4aXQoc29ueV9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihzb255KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zdW5wbHVzLmMgYi9kcml2ZXJzL2hpZC9oaWQtc3VucGx1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTY4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtc3VucGx1cy5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBzdW5wbHVzICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCitzdGF0aWMgdm9pZCBzcF9yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAorCQl1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJaWYgKHJzaXplID49IDEwNyAmJiByZGVzY1sxMDRdID09IDB4MjYgJiYgcmRlc2NbMTA1XSA9PSAweDgwICYmCisJCQlyZGVzY1sxMDZdID09IDB4MDMpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBTdW5wbHVzIFdpcmVsZXNzIERlc2t0b3AgIgorCQkJCSJyZXBvcnQgZGVzY3JpcHRvclxuIik7CisJCXJkZXNjWzEwNV0gPSByZGVzY1sxMTBdID0gMHgwMzsKKwkJcmRlc2NbMTA2XSA9IHJkZXNjWzExMV0gPSAweDIxOworCX0KK30KKworI2RlZmluZSBzcF9tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgc3BfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwljYXNlIDB4MjAwMzogc3BfbWFwX2tleV9jbGVhcihLRVlfWk9PTUlOKTsJCWJyZWFrOworCWNhc2UgMHgyMTAzOiBzcF9tYXBfa2V5X2NsZWFyKEtFWV9aT09NT1VUKTsJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgc3BfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TVU5QTFVTLCBVU0JfREVWSUNFX0lEX1NVTlBMVVNfV0RFU0tUT1ApIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHNwX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgc3BfZHJpdmVyID0geworCS5uYW1lID0gInN1bnBsdXMiLAorCS5pZF90YWJsZSA9IHNwX2RldmljZXMsCisJLnJlcG9ydF9maXh1cCA9IHNwX3JlcG9ydF9maXh1cCwKKwkuaW5wdXRfbWFwcGluZyA9IHNwX2lucHV0X21hcHBpbmcsCit9OworCitzdGF0aWMgaW50IHNwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmc3BfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgc3BfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmc3BfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3BfaW5pdCk7Cittb2R1bGVfZXhpdChzcF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihzdW5wbHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtdG1mZi5jIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwpzaW1pbGFyaXR5IGluZGV4IDYwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2hpZC91c2JoaWQvaGlkLXRtZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvaGlkLXRtZmYuYwppbmRleCAxNDQ1NzhiLi4xYjdjYmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXRtZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jCkBAIC0yNywyMyArMjcsMTcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0KLSN1bmRlZiBERUJVRwogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCi0jaW5jbHVkZSA8bGludXgvaGlkLmg+Ci0jaW5jbHVkZSAidXNiaGlkLmgiCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjaW5jbHVkZSAidXNiaGlkL3VzYmhpZC5oIgogCiAvKiBVc2FnZXMgZm9yIHRocnVzdG1hc3RlciBkZXZpY2VzIEkga25vdyBhYm91dCAqLwogI2RlZmluZSBUSFJVU1RNQVNURVJfVVNBR0VfRkYJKEhJRF9VUF9HRU5ERVNLIHwgMHhiYikKIAotc3RydWN0IGRldl90eXBlIHsKLQl1MTYgaWRWZW5kb3I7Ci0JdTE2IGlkUHJvZHVjdDsKLQljb25zdCBzaWduZWQgc2hvcnQgKmZmOwotfTsKLQogc3RhdGljIGNvbnN0IHNpZ25lZCBzaG9ydCBmZl9ydW1ibGVbXSA9IHsKIAlGRl9SVU1CTEUsCiAJLTEKQEAgLTU0LDIxICs0OCwxMyBAQAogCS0xCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl90eXBlIGRldmljZXNbXSA9IHsKLQl7IDB4NDRmLCAweGIzMDAsIGZmX3J1bWJsZSB9LAotCXsgMHg0NGYsIDB4YjMwNCwgZmZfcnVtYmxlIH0sCi0JeyAweDQ0ZiwgMHhiNjUxLCBmZl9ydW1ibGUgfSwJLyogRkdUIFJ1bWJsZSBGb3JjZSBXaGVlbCAqLwotCXsgMHg0NGYsIDB4YjY1NCwgZmZfam95c3RpY2sgfSwJLyogRkdUIEZvcmNlIEZlZWRiYWNrIFdoZWVsICovCi19OwotCiBzdHJ1Y3QgdG1mZl9kZXZpY2UgewogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJc3RydWN0IGhpZF9maWVsZCAqZmZfZmllbGQ7CiB9OwogCiAvKiBDaGFuZ2VzIHZhbHVlcyBmcm9tIDAgdG8gMHhmZmZmIGludG8gdmFsdWVzIGZyb20gbWluaW11bSB0byBtYXhpbXVtICovCi1zdGF0aWMgaW5saW5lIGludCBoaWRfdG1mZl9zY2FsZV91MTYodW5zaWduZWQgaW50IGluLAotCQkJCWludCBtaW5pbXVtLCBpbnQgbWF4aW11bSkKK3N0YXRpYyBpbmxpbmUgaW50IHRtZmZfc2NhbGVfdTE2KHVuc2lnbmVkIGludCBpbiwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtKQogewogCWludCByZXQ7CiAKQEAgLTgxLDggKzY3LDcgQEAKIH0KIAogLyogQ2hhbmdlcyB2YWx1ZXMgZnJvbSAtMHg4MCB0byAweDdmIGludG8gdmFsdWVzIGZyb20gbWluaW11bSB0byBtYXhpbXVtICovCi1zdGF0aWMgaW5saW5lIGludCBoaWRfdG1mZl9zY2FsZV9zOChpbnQgaW4sCi0JCQkJICAgIGludCBtaW5pbXVtLCBpbnQgbWF4aW11bSkKK3N0YXRpYyBpbmxpbmUgaW50IHRtZmZfc2NhbGVfczgoaW50IGluLCBpbnQgbWluaW11bSwgaW50IG1heGltdW0pCiB7CiAJaW50IHJldDsKIApAQCAtOTQsNyArNzksOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaGlkX3RtZmZfcGxheShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKK3N0YXRpYyBpbnQgdG1mZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQogewogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB0bWZmX2RldmljZSAqdG1mZiA9IGRhdGE7CkBAIC0xMDQsMTAgKzkwLDEwIEBACiAKIAlzd2l0Y2ggKGVmZmVjdC0+dHlwZSkgewogCWNhc2UgRkZfQ09OU1RBTlQ6Ci0JCXggPSBoaWRfdG1mZl9zY2FsZV9zOChlZmZlY3QtPnUucmFtcC5zdGFydF9sZXZlbCwKKwkJeCA9IHRtZmZfc2NhbGVfczgoZWZmZWN0LT51LnJhbXAuc3RhcnRfbGV2ZWwsCiAJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21pbmltdW0sCiAJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21heGltdW0pOwotCQl5ID0gaGlkX3RtZmZfc2NhbGVfczgoZWZmZWN0LT51LnJhbXAuZW5kX2xldmVsLAorCQl5ID0gdG1mZl9zY2FsZV9zOChlZmZlY3QtPnUucmFtcC5lbmRfbGV2ZWwsCiAJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21pbmltdW0sCiAJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21heGltdW0pOwogCkBAIC0xMTgsMTAgKzEwNCwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgRkZfUlVNQkxFOgotCQlsZWZ0ID0gaGlkX3RtZmZfc2NhbGVfdTE2KGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGUsCisJCWxlZnQgPSB0bWZmX3NjYWxlX3UxNihlZmZlY3QtPnUucnVtYmxlLndlYWtfbWFnbml0dWRlLAogCQkJCQlmZl9maWVsZC0+bG9naWNhbF9taW5pbXVtLAogCQkJCQlmZl9maWVsZC0+bG9naWNhbF9tYXhpbXVtKTsKLQkJcmlnaHQgPSBoaWRfdG1mZl9zY2FsZV91MTYoZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlLAorCQlyaWdodCA9IHRtZmZfc2NhbGVfdTE2KGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZSwKIAkJCQkJZmZfZmllbGQtPmxvZ2ljYWxfbWluaW11bSwKIAkJCQkJZmZfZmllbGQtPmxvZ2ljYWxfbWF4aW11bSk7CiAKQEAgLTEzNCwxNCArMTIwLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBoaWRfdG1mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCitzdGF0aWMgaW50IHRtZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBjb25zdCBzaWduZWQgc2hvcnQgKmZmX2JpdHMpCiB7CiAJc3RydWN0IHRtZmZfZGV2aWNlICp0bWZmOwogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqcmVwb3J0X2xpc3Q7Ci0Jc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBsaXN0X2VudHJ5KGhpZC0+aW5wdXRzLm5leHQsIHN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9lbnRyeShoaWQtPmlucHV0cy5uZXh0LAorCQkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGhpZGlucHV0LT5pbnB1dDsKLQljb25zdCBzaWduZWQgc2hvcnQgKmZmX2JpdHMgPSBmZl9qb3lzdGljazsKIAlpbnQgZXJyb3I7CiAJaW50IGk7CiAKQEAgLTE2Myw2MyArMTQ5LDEyMSBAQAogCQkJc3dpdGNoIChmaWVsZC0+dXNhZ2VbMF0uaGlkKSB7CiAJCQljYXNlIFRIUlVTVE1BU1RFUl9VU0FHRV9GRjoKIAkJCQlpZiAoZmllbGQtPnJlcG9ydF9jb3VudCA8IDIpIHsKLQkJCQkJd2FybigiaWdub3JpbmcgRkYgZmllbGQgd2l0aCByZXBvcnRfY291bnQgPCAyIik7CisJCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKKwkJCQkJCSJ3aXRoIHJlcG9ydF9jb3VudCA8IDJcbiIpOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAKLQkJCQlpZiAoZmllbGQtPmxvZ2ljYWxfbWF4aW11bSA9PSBmaWVsZC0+bG9naWNhbF9taW5pbXVtKSB7Ci0JCQkJCXdhcm4oImlnbm9yaW5nIEZGIGZpZWxkIHdpdGggbG9naWNhbF9tYXhpbXVtID09IGxvZ2ljYWxfbWluaW11bSIpOworCQkJCWlmIChmaWVsZC0+bG9naWNhbF9tYXhpbXVtID09CisJCQkJCQlmaWVsZC0+bG9naWNhbF9taW5pbXVtKSB7CisJCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKKwkJCQkJCQkid2l0aCBsb2dpY2FsX21heGltdW0gIgorCQkJCQkJCSI9PSBsb2dpY2FsX21pbmltdW1cbiIpOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAKIAkJCQlpZiAodG1mZi0+cmVwb3J0ICYmIHRtZmYtPnJlcG9ydCAhPSByZXBvcnQpIHsKLQkJCQkJd2FybigiaWdub3JpbmcgRkYgZmllbGQgaW4gb3RoZXIgcmVwb3J0Iik7CisJCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKKwkJCQkJCQkiaW4gb3RoZXIgcmVwb3J0XG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJaWYgKHRtZmYtPmZmX2ZpZWxkICYmIHRtZmYtPmZmX2ZpZWxkICE9IGZpZWxkKSB7Ci0JCQkJCXdhcm4oImlnbm9yaW5nIGR1cGxpY2F0ZSBGRiBmaWVsZCIpOworCQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyAiCisJCQkJCQkJImR1cGxpY2F0ZSBGRiBmaWVsZFxuIik7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAogCQkJCXRtZmYtPnJlcG9ydCA9IHJlcG9ydDsKIAkJCQl0bWZmLT5mZl9maWVsZCA9IGZpZWxkOwogCi0JCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7IGkrKykgewotCQkJCQlpZiAoaW5wdXRfZGV2LT5pZC52ZW5kb3IgPT0gZGV2aWNlc1tpXS5pZFZlbmRvciAmJgotCQkJCQkgICAgaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID09IGRldmljZXNbaV0uaWRQcm9kdWN0KSB7Ci0JCQkJCQlmZl9iaXRzID0gZGV2aWNlc1tpXS5mZjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCiAJCQkJZm9yIChpID0gMDsgZmZfYml0c1tpXSA+PSAwOyBpKyspCiAJCQkJCXNldF9iaXQoZmZfYml0c1tpXSwgaW5wdXRfZGV2LT5mZmJpdCk7CiAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQl3YXJuKCJpZ25vcmluZyB1bmtub3duIG91dHB1dCB1c2FnZSAlMDh4IiwgZmllbGQtPnVzYWdlWzBdLmhpZCk7CisJCQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAiaWdub3JpbmcgdW5rbm93biBvdXRwdXQgIgorCQkJCQkJInVzYWdlICUwOHhcbiIsCisJCQkJCQlmaWVsZC0+dXNhZ2VbMF0uaGlkKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfQogCX0KIAogCWlmICghdG1mZi0+cmVwb3J0KSB7Ci0JCWVycigiY2FudCBmaW5kIEZGIGZpZWxkIGluIG91dHB1dCByZXBvcnRzXG4iKTsKKwkJZGV2X2VycigmaGlkLT5kZXYsICJjYW4ndCBmaW5kIEZGIGZpZWxkIGluIG91dHB1dCByZXBvcnRzXG4iKTsKIAkJZXJyb3IgPSAtRU5PREVWOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JZXJyb3IgPSBpbnB1dF9mZl9jcmVhdGVfbWVtbGVzcyhpbnB1dF9kZXYsIHRtZmYsIGhpZF90bWZmX3BsYXkpOworCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoaW5wdXRfZGV2LCB0bWZmLCB0bWZmX3BsYXkpOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsOwogCi0JaW5mbygiRm9yY2UgZmVlZGJhY2sgZm9yIFRocnVzdE1hc3RlciBkZXZpY2VzIGJ5IFppbnggVmVyaXR1c2UgPHppbnhAZXBpY3NvbC5vcmc+Iik7CisJZGV2X2luZm8oJmhpZC0+ZGV2LCAiZm9yY2UgZmVlZGJhY2sgZm9yIFRocnVzdE1hc3RlciBkZXZpY2VzIGJ5IFppbnggIgorCQkJIlZlcml0dXNlIDx6aW54QGVwaWNzb2wub3JnPiIpOwogCXJldHVybiAwOwogCi0gZmFpbDoKK2ZhaWw6CiAJa2ZyZWUodG1mZik7CiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW50IHRtX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXRtZmZfaW5pdChoZGV2LCAodm9pZCAqKWlkLT5kcml2ZXJfZGF0YSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgdG1fZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjMwMCksCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKWZmX3J1bWJsZSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjMwNCksCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKWZmX3J1bWJsZSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjY1MSksCS8qIEZHVCBSdW1ibGUgRm9yY2UgV2hlZWwgKi8KKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpZmZfcnVtYmxlIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RIUlVTVE1BU1RFUiwgMHhiNjU0KSwJLyogRkdUIEZvcmNlIEZlZWRiYWNrIFdoZWVsICovCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKWZmX2pveXN0aWNrIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHRtX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgdG1fZHJpdmVyID0geworCS5uYW1lID0gInRocnVzdG1hc3RlciIsCisJLmlkX3RhYmxlID0gdG1fZGV2aWNlcywKKwkucHJvYmUgPSB0bV9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgdG1faW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZ0bV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCB0bV9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0bV9pbml0KTsKK21vZHVsZV9leGl0KHRtX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKHRocnVzdG1hc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXpwZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMKc2ltaWxhcml0eSBpbmRleCA2NyUKcmVuYW1lIGZyb20gZHJpdmVycy9oaWQvdXNiaGlkL2hpZC16cGZmLmMKcmVuYW1lIHRvIGRyaXZlcnMvaGlkL2hpZC16cGZmLmMKaW5kZXggNWE2ODgyNy4uZWE4MmYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC16cGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXpwZmYuYwpAQCAtMjEsMTYgKzIxLDE5IEBACiAgKi8KIAogCisjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlICJ1c2JoaWQuaCIKKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKIAogc3RydWN0IHpwZmZfZGV2aWNlIHsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwogfTsKIAotc3RhdGljIGludCBoaWRfenBmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKK3N0YXRpYyBpbnQgenBmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCiB7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CkBAIC01OCw3ICs2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBoaWRfenBmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCitzdGF0aWMgaW50IHpwZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXN0cnVjdCB6cGZmX2RldmljZSAqenBmZjsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwpAQCAtNzAsMTQgKzczLDE0IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGlkLXpwZmY6IG5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOworCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtenBmZjogbm90IGVub3VnaCBmaWVsZHMgaW4gcmVwb3J0XG4iKTsKKwkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIGZpZWxkcyBpbiByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTg3LDcgKzkwLDcgQEAKIAogCXNldF9iaXQoRkZfUlVNQkxFLCBkZXYtPmZmYml0KTsKIAotCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoZGV2LCB6cGZmLCBoaWRfenBmZl9wbGF5KTsKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGRldiwgenBmZiwgenBmZl9wbGF5KTsKIAlpZiAoZXJyb3IpIHsKIAkJa2ZyZWUoenBmZik7CiAJCXJldHVybiBlcnJvcjsKQEAgLTEwMCw4ICsxMDMsNjAgQEAKIAl6cGZmLT5yZXBvcnQtPmZpZWxkWzNdLT52YWx1ZVswXSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCB6cGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBaZXJvcGx1cyBiYXNlZCBkZXZpY2VzIGJ5ICIKKwlkZXZfaW5mbygmaGlkLT5kZXYsICJmb3JjZSBmZWVkYmFjayBmb3IgWmVyb3BsdXMgYmFzZWQgZGV2aWNlcyBieSAiCiAJICAgICAgICJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgenBfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJenBmZl9pbml0KGhkZXYpOworCisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIHpwX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWkVST1BMVVMsIDB4MDAwNSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWkVST1BMVVMsIDB4MDAzMCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgenBfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciB6cF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiemVyb3BsdXMiLAorCS5pZF90YWJsZSA9IHpwX2RldmljZXMsCisJLnByb2JlID0genBfcHJvYmUsCit9OworCitzdGF0aWMgaW50IHpwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmenBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgenBfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmenBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoenBfaW5pdCk7Cittb2R1bGVfZXhpdCh6cF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUih6ZXJvcGx1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWRyYXcuYyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCmluZGV4IGM0MGYwNDAuLjQ5N2UwZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZHJhdy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlpZiAoIWRldi0+aGlkX291dHB1dF9yYXdfcmVwb3J0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChjb3VudCA+IEhJRF9NSU5fQlVGRkVSX1NJWkUpIHsKKwlpZiAoY291bnQgPiBISURfTUFYX0JVRkZFUl9TSVpFKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImhpZHJhdzogcGlkICVkIHBhc3NlZCB0b28gbGFyZ2UgcmVwb3J0XG4iLAogCQkJCXRhc2tfcGlkX25yKGN1cnJlbnQpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODEsNyArMTgxLDcgQEAKIAogCWRldiA9IGhpZHJhd190YWJsZVttaW5vcl07CiAJaWYgKCFkZXYtPm9wZW4rKykKLQkJZGV2LT5oaWQtPmhpZF9vcGVuKGRldi0+aGlkKTsKKwkJZGV2LT5oaWQtPmxsX2RyaXZlci0+b3BlbihkZXYtPmhpZCk7CiAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJm1pbm9yc19sb2NrKTsKQEAgLTIwNyw3ICsyMDcsNyBAQAogCWRldiA9IGhpZHJhd190YWJsZVttaW5vcl07CiAJaWYgKCFkZXYtPm9wZW4tLSkgewogCQlpZiAobGlzdC0+aGlkcmF3LT5leGlzdCkKLQkJCWRldi0+aGlkLT5oaWRfY2xvc2UoZGV2LT5oaWQpOworCQkJZGV2LT5oaWQtPmxsX2RyaXZlci0+Y2xvc2UoZGV2LT5oaWQpOwogCQllbHNlCiAJCQlrZnJlZShsaXN0LT5oaWRyYXcpOwogCX0KQEAgLTM2Nyw3ICszNjcsNyBAQAogCWRldmljZV9kZXN0cm95KGhpZHJhd19jbGFzcywgTUtERVYoaGlkcmF3X21ham9yLCBoaWRyYXctPm1pbm9yKSk7CiAKIAlpZiAoaGlkcmF3LT5vcGVuKSB7Ci0JCWhpZC0+aGlkX2Nsb3NlKGhpZCk7CisJCWhpZC0+bGxfZHJpdmVyLT5jbG9zZShoaWQpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhpZHJhdy0+d2FpdCk7CiAJfSBlbHNlIHsKIAkJa2ZyZWUoaGlkcmF3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9LY29uZmlnIGIvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcKaW5kZXggMThmMDkxMC4uNWQ5YWE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcKQEAgLTI0LDg4ICsyNCwxMyBAQAogY29tbWVudCAiSW5wdXQgY29yZSBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIEhJRCBpbnB1dCBsYXllciBvciBISURCUCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX0hJRCAmJiBJTlBVVD1uCiAKLWNvbmZpZyBVU0JfSElESU5QVVRfUE9XRVJCT09LCi0JYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIEFwcGxlIGxhcHRvcC9hbHVtaW51bSBVU0Igc3BlY2lhbCBrZXlzIgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gVVNCX0hJRAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHNwZWNpYWwga2V5cyAoRm4sIE51bWxvY2spIG9uCi0JICBBcHBsZSBpQm9va3MsIFBvd2VyQm9va3MsIE1hY0Jvb2tzLCBNYWNCb29rIFByb3MgYW5kIGFsdW1pbnVtIFVTQgotCSAga2V5Ym9hcmRzLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgSElEX0ZGCi0JYm9vbCAiRm9yY2UgZmVlZGJhY2sgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFVTQl9ISUQgJiYgRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpcyB5b3Ugd2FudCBmb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBhIGZldyBISUQgZGV2aWNlcy4KLQkgIFNlZSBiZWxvdyBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLgotCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9pbnB1dC9mZi50eHQ+IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JjZQotCSAgZmVlZGJhY2sgQVBJLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSElEX1BJRAogCWJvb2wgIlBJRCBkZXZpY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhJRF9GRgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBQSUQtY29tcGxpYW50IGRldmljZSBhbmQgd2lzaCB0byBlbmFibGUgZm9yY2UKIAkgIGZlZWRiYWNrIGZvciBpdC4gTWljcm9zb2Z0IFNpZGV3aW5kZXIgRm9yY2UgRmVlZGJhY2sgMiBpcyBvbmUgb2Ygc3VjaAogCSAgZGV2aWNlcy4KIAotY29uZmlnIExPR0lURUNIX0ZGCi0JYm9vbCAiTG9naXRlY2ggZGV2aWNlcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gSElEX0ZGCi0Jc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MgaWYgVVNCX0hJRAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIGRldmljZXM6Ci0JICAtIExvZ2l0ZWNoIFdpbmdNYW4gQ29yZGxlc3MgUnVtYmxlUGFkCi0JICAtIExvZ2l0ZWNoIFdpbmdNYW4gQ29yZGxlc3MgUnVtYmxlUGFkIDIKLQkgIC0gTG9naXRlY2ggV2luZ01hbiBGb3JjZSAzRAotCSAgLSBMb2dpdGVjaCBGb3JtdWxhIEZvcmNlIEVYCi0JICAtIExvZ2l0ZWNoIE1PTU8gRm9yY2Ugd2hlZWwKLQotCSAgYW5kIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBmb3IgdGhlbS4KLQkgIE5vdGU6IGlmIHlvdSBzYXkgTiBoZXJlLCB0aGlzIGRldmljZSB3aWxsIHN0aWxsIGJlIHN1cHBvcnRlZCwgYnV0IHdpdGhvdXQKLQkgIGZvcmNlIGZlZWRiYWNrLgotCi1jb25maWcgTE9HSVJVTUJMRVBBRDJfRkYKLQlib29sICJMb2dpdGVjaCBSdW1ibGVwYWQgMiBzdXBwb3J0IgotCWRlcGVuZHMgb24gSElEX0ZGCi0Jc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MgaWYgVVNCX0hJRAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIExvZ2l0ZWNoCi0JICBSdW1ibGVwYWQgMiBkZXZpY2VzLgotCi1jb25maWcgUEFOVEhFUkxPUkRfRkYKLQlib29sICJQYW50aGVyTG9yZC9HcmVlbkFzaWEgYmFzZWQgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBISURfRkYKLQlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUyBpZiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBnYW1lIGNvbnRyb2xsZXIKLQkgIG9yIGFkYXB0ZXIgYW5kIHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGl0LgotCi1jb25maWcgVEhSVVNUTUFTVEVSX0ZGCi0JYm9vbCAiVGhydXN0TWFzdGVyIGRldmljZXMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhJRF9GRgotCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTIGlmIFVTQl9ISUQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgVEhSVVNUTUFTVEVSIEZpcmVTdG9yZSBEdWFsIFBvd2VyIDIgb3IKLQkgIGEgVEhSVVNUTUFTVEVSIEZlcnJhcmkgR1QgUnVtYmxlIEZvcmNlIG9yIEZvcmNlIEZlZWRiYWNrIFdoZWVsLAotCSAgYW5kIHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGl0LgotCSAgTm90ZTogaWYgeW91IHNheSBOIGhlcmUsIHRoaXMgZGV2aWNlIHdpbGwgc3RpbGwgYmUgc3VwcG9ydGVkLCBidXQgd2l0aG91dAotCSAgZm9yY2UgZmVlZGJhY2suCi0KLWNvbmZpZyBaRVJPUExVU19GRgotCWJvb2wgIlplcm9wbHVzIGJhc2VkIGdhbWUgY29udHJvbGxlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gSElEX0ZGCi0Jc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MgaWYgVVNCX0hJRAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBaZXJvcGx1cyBiYXNlZCBnYW1lIGNvbnRyb2xsZXIgYW5kIHdhbnQgdG8KLQkgIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBmb3IgaXQuCi0KIGNvbmZpZyBVU0JfSElEREVWCiAJYm9vbCAiL2Rldi9oaWRkZXYgcmF3IEhJRCBkZXZpY2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9ISUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL3VzYmhpZC9NYWtlZmlsZQppbmRleCAwMGE3YjcwLi4xMzI5ZWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlCkBAIC0xMywyNCArMTMsNiBAQAogaWZlcSAoJChDT05GSUdfSElEX1BJRCkseSkKIAl1c2JoaWQtb2JqcwkrPSBoaWQtcGlkZmYubwogZW5kaWYKLWlmZXEgKCQoQ09ORklHX0xPR0lURUNIX0ZGKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC1sZ2ZmLm8KLWVuZGlmCi1pZmVxICgkKENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRikseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWQtbGcyZmYubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX1BBTlRIRVJMT1JEX0ZGKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC1wbGZmLm8KLWVuZGlmCi1pZmVxICgkKENPTkZJR19USFJVU1RNQVNURVJfRkYpLHkpCi0JdXNiaGlkLW9ianMJKz0gaGlkLXRtZmYubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX1pFUk9QTFVTX0ZGKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC16cGZmLm8KLWVuZGlmCi1pZmVxICgkKENPTkZJR19ISURfRkYpLHkpCi0JdXNiaGlkLW9ianMJKz0gaGlkLWZmLm8KLWVuZGlmCiAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLm8KIG9iai0kKENPTkZJR19VU0JfS0JEKQkJKz0gdXNia2JkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKaW5kZXggMjdmZTRkOC4uMWQzYjhhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKQEAgLTQ0LDggKzQ0LDYgQEAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBISUQgY29yZSBkcml2ZXIiCiAjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCiAKLXN0YXRpYyBjaGFyICpoaWRfdHlwZXNbXSA9IHsiRGV2aWNlIiwgIlBvaW50ZXIiLCAiTW91c2UiLCAiRGV2aWNlIiwgIkpveXN0aWNrIiwKLQkJCQkiR2FtZXBhZCIsICJLZXlib2FyZCIsICJLZXlwYWQiLCAiTXVsdGktQXhpcyBDb250cm9sbGVyIn07CiAvKgogICogTW9kdWxlIHBhcmFtZXRlcnMuCiAgKi8KQEAgLTYxLDEyICs1OSw2IEBACiAJCSIgcXVpcmtzPXZlbmRvcklEOnByb2R1Y3RJRDpxdWlya3MiCiAJCSIgd2hlcmUgdmVuZG9ySUQsIHByb2R1Y3RJRCwgYW5kIHF1aXJrcyBhcmUgYWxsIGluIgogCQkiIDB4LXByZWZpeGVkIGhleCIpOwotc3RhdGljIGNoYXIgKnJkZXNjX3F1aXJrc19wYXJhbVtNQVhfVVNCSElEX0JPT1RfUVVJUktTXSA9IHsgWyAwIC4uLiAoTUFYX1VTQkhJRF9CT09UX1FVSVJLUyAtIDEpIF0gPSBOVUxMIH07Ci1tb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQocmRlc2NfcXVpcmtzLCByZGVzY19xdWlya3NfcGFyYW0sIGNoYXJwLCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocmRlc2NfcXVpcmtzLCAiQWRkL21vZGlmeSByZXBvcnQgZGVzY3JpcHRvciBxdWlya3MgYnkgc3BlY2lmeWluZyAiCi0JCSIgcmRlc2NfcXVpcmtzPXZlbmRvcklEOnByb2R1Y3RJRDpyZGVzY19xdWlya3MiCi0JCSIgd2hlcmUgdmVuZG9ySUQsIHByb2R1Y3RJRCwgYW5kIHJkZXNjX3F1aXJrcyBhcmUgYWxsIGluIgotCQkiIDB4LXByZWZpeGVkIGhleCIpOwogLyoKICAqIElucHV0IHN1Ym1pc3Npb24gYW5kIEkvTyBlcnJvciBoYW5kbGVyLgogICovCkBAIC0xOTcsMzEgKzE4OSwzMiBAQAogCWludAkJCXN0YXR1czsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQkJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KLQkJCXVzYmhpZC0+cmV0cnlfZGVsYXkgPSAwOwotCQkJaGlkX2lucHV0X3JlcG9ydCh1cmItPmNvbnRleHQsIEhJRF9JTlBVVF9SRVBPUlQsCi0JCQkJCSB1cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCwgMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAtRVBJUEU6CQkvKiBzdGFsbCAqLwotCQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKLQkJCXNldF9iaXQoSElEX0NMRUFSX0hBTFQsICZ1c2JoaWQtPmlvZmwpOwotCQkJc2NoZWR1bGVfd29yaygmdXNiaGlkLT5yZXNldF93b3JrKTsKLQkJCXJldHVybjsKLQkJY2FzZSAtRUNPTk5SRVNFVDoJLyogdW5saW5rICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KLQkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FUFJPVE86CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KLQkJY2FzZSAtRVRJTUU6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KLQkJY2FzZSAtRVRJTUVET1VUOgkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQuLi4gKi8KLQkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0JCQloaWRfaW9fZXJyb3IoaGlkKTsKLQkJCXJldHVybjsKLQkJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCQl3YXJuKCJpbnB1dCBpcnEgc3RhdHVzICVkIHJlY2VpdmVkIiwgdXJiLT5zdGF0dXMpOworCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCisJCXVzYmhpZC0+cmV0cnlfZGVsYXkgPSAwOworCQloaWRfaW5wdXRfcmVwb3J0KHVyYi0+Y29udGV4dCwgSElEX0lOUFVUX1JFUE9SVCwKKwkJCQkgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCwgMSk7CisJCWJyZWFrOworCWNhc2UgLUVQSVBFOgkJLyogc3RhbGwgKi8KKwkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwkJc2V0X2JpdChISURfQ0xFQVJfSEFMVCwgJnVzYmhpZC0+aW9mbCk7CisJCXNjaGVkdWxlX3dvcmsoJnVzYmhpZC0+cmVzZXRfd29yayk7CisJCXJldHVybjsKKwljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KKwkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwkJcmV0dXJuOworCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCWNhc2UgLUVUSU1FOgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCisJY2FzZSAtRVRJTUVET1VUOgkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQuLi4gKi8KKwkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwkJaGlkX2lvX2Vycm9yKGhpZCk7CisJCXJldHVybjsKKwlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJZGV2X3dhcm4oJnVyYi0+ZGV2LT5kZXYsICJpbnB1dCBpcnEgc3RhdHVzICVkICAiCisJCQkJInJlY2VpdmVkXG4iLCB1cmItPnN0YXR1cyk7CiAJfQogCiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKQEAgLTI0MCwxMyArMjMzLDE2IEBACiBzdGF0aWMgaW50IGhpZF9zdWJtaXRfb3V0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwljaGFyICpyYXdfcmVwb3J0OwogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCi0JcmVwb3J0ID0gdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXR0YWlsXTsKKwlyZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdLnJlcG9ydDsKKwlyYXdfcmVwb3J0ID0gdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXR0YWlsXS5yYXdfcmVwb3J0OwogCi0JaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCB1c2JoaWQtPm91dGJ1Zik7CiAJdXNiaGlkLT51cmJvdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMSArIChyZXBvcnQtPmlkID4gMCk7CiAJdXNiaGlkLT51cmJvdXQtPmRldiA9IGhpZF90b191c2JfZGV2KGhpZCk7CisJbWVtY3B5KHVzYmhpZC0+b3V0YnVmLCByYXdfcmVwb3J0LCB1c2JoaWQtPnVyYm91dC0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisJa2ZyZWUocmF3X3JlcG9ydCk7CiAKIAlkYmdfaGlkKCJzdWJtaXR0aW5nIG91dCB1cmJcbiIpOwogCkBAIC0yNjIsMTcgKzI1OCwyMCBAQAogewogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJdW5zaWduZWQgY2hhciBkaXI7CisJY2hhciAqcmF3X3JlcG9ydDsKIAlpbnQgbGVuOwogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCiAJcmVwb3J0ID0gdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLnJlcG9ydDsKKwlyYXdfcmVwb3J0ID0gdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLnJhd19yZXBvcnQ7CiAJZGlyID0gdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLmRpcjsKIAogCWxlbiA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcG9ydC0+aWQgPiAwKTsKIAlpZiAoZGlyID09IFVTQl9ESVJfT1VUKSB7Ci0JCWhpZF9vdXRwdXRfcmVwb3J0KHJlcG9ydCwgdXNiaGlkLT5jdHJsYnVmKTsKIAkJdXNiaGlkLT51cmJjdHJsLT5waXBlID0gdXNiX3NuZGN0cmxwaXBlKGhpZF90b191c2JfZGV2KGhpZCksIDApOwogCQl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBsZW47CisJCW1lbWNweSh1c2JoaWQtPmN0cmxidWYsIHJhd19yZXBvcnQsIGxlbik7CisJCWtmcmVlKHJhd19yZXBvcnQpOwogCX0gZWxzZSB7CiAJCWludCBtYXhwYWNrZXQsIHBhZGxlbjsKIApAQCAtMzE5LDE3ICszMTgsMTggQEAKIAlpbnQgdW5wbHVnID0gMDsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQkJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KLQkJCWJyZWFrOwotCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLwotCQkJdW5wbHVnID0gMTsKLQkJY2FzZSAtRUlMU0VROgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCi0JCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KLQkJY2FzZSAtRU5PRU5UOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQkJd2Fybigib3V0cHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWQiLCB1cmItPnN0YXR1cyk7CisJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KKwkJdW5wbHVnID0gMTsKKwljYXNlIC1FSUxTRVE6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KKwljYXNlIC1FUFJPVE86CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KKwljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KKwljYXNlIC1FTk9FTlQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiBlcnJvciAqLworCQlkZXZfd2FybigmdXJiLT5kZXYtPmRldiwgIm91dHB1dCBpcnEgc3RhdHVzICVkICIKKwkJCQkicmVjZWl2ZWRcbiIsIHVyYi0+c3RhdHVzKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7CkBAIC0zNjcsMjEgKzM2NywyMyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCi0JCQlpZiAodXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLmRpciA9PSBVU0JfRElSX0lOKQotCQkJCWhpZF9pbnB1dF9yZXBvcnQodXJiLT5jb250ZXh0LCB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmVwb3J0LT50eXBlLAotCQkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KLQkJCXVucGx1ZyA9IDE7Ci0JCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FUFJPVE86CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KLQkJY2FzZSAtRUNPTk5SRVNFVDoJLyogdW5saW5rICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJY2FzZSAtRVBJUEU6CQkvKiByZXBvcnQgbm90IGF2YWlsYWJsZSAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQkJd2FybigiY3RybCB1cmIgc3RhdHVzICVkIHJlY2VpdmVkIiwgdXJiLT5zdGF0dXMpOworCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCisJCWlmICh1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0uZGlyID09IFVTQl9ESVJfSU4pCisJCQloaWRfaW5wdXRfcmVwb3J0KHVyYi0+Y29udGV4dCwKKwkJCQl1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmVwb3J0LT50eXBlLAorCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgsIDApOworCQlicmVhazsKKwljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLworCQl1bnBsdWcgPSAxOworCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FUElQRToJCS8qIHJlcG9ydCBub3QgYXZhaWxhYmxlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiBlcnJvciAqLworCQlkZXZfd2FybigmdXJiLT5kZXYtPmRldiwgImN0cmwgdXJiIHN0YXR1cyAlZCAiCisJCQkJInJlY2VpdmVkXG4iLCB1cmItPnN0YXR1cyk7CiAJfQogCiAJaWYgKHVucGx1ZykKQEAgLTQwOCw2ICs0MTAsNyBAQAogCWludCBoZWFkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisJaW50IGxlbiA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcG9ydC0+aWQgPiAwKTsKIAogCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfTk9HRVQpICYmIGRpciA9PSBVU0JfRElSX0lOKQogCQlyZXR1cm47CkBAIC00MTgsMTEgKzQyMSwxOCBAQAogCiAJCWlmICgoaGVhZCA9ICh1c2JoaWQtPm91dGhlYWQgKyAxKSAmIChISURfT1VUUFVUX0ZJRk9fU0laRSAtIDEpKSA9PSB1c2JoaWQtPm91dHRhaWwpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOwotCQkJd2Fybigib3V0cHV0IHF1ZXVlIGZ1bGwiKTsKKwkJCWRldl93YXJuKCZoaWQtPmRldiwgIm91dHB1dCBxdWV1ZSBmdWxsXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCXVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0gPSByZXBvcnQ7CisJCXVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0ucmF3X3JlcG9ydCA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCF1c2JoaWQtPm91dFt1c2JoaWQtPm91dGhlYWRdLnJhd19yZXBvcnQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOworCQkJd2Fybigib3V0cHV0IHF1ZXVlaW5nIGZhaWxlZCIpOworCQkJcmV0dXJuOworCQl9CisJCWhpZF9vdXRwdXRfcmVwb3J0KHJlcG9ydCwgdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXRoZWFkXS5yYXdfcmVwb3J0KTsKKwkJdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXRoZWFkXS5yZXBvcnQgPSByZXBvcnQ7CiAJCXVzYmhpZC0+b3V0aGVhZCA9IGhlYWQ7CiAKIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpCkBAIC00MzcsMTAgKzQ0NywxOSBAQAogCiAJaWYgKChoZWFkID0gKHVzYmhpZC0+Y3RybGhlYWQgKyAxKSAmIChISURfQ09OVFJPTF9GSUZPX1NJWkUgLSAxKSkgPT0gdXNiaGlkLT5jdHJsdGFpbCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7Ci0JCXdhcm4oImNvbnRyb2wgcXVldWUgZnVsbCIpOworCQlkZXZfd2FybigmaGlkLT5kZXYsICJjb250cm9sIHF1ZXVlIGZ1bGxcbiIpOwogCQlyZXR1cm47CiAJfQogCisJaWYgKGRpciA9PSBVU0JfRElSX09VVCkgeworCQl1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsaGVhZF0ucmF3X3JlcG9ydCA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCF1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsaGVhZF0ucmF3X3JlcG9ydCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworCQkJd2FybigiY29udHJvbCBxdWV1ZWluZyBmYWlsZWQiKTsKKwkJCXJldHVybjsKKwkJfQorCQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yYXdfcmVwb3J0KTsKKwl9CiAJdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLnJlcG9ydCA9IHJlcG9ydDsKIAl1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsaGVhZF0uZGlyID0gZGlyOwogCXVzYmhpZC0+Y3RybGhlYWQgPSBoZWFkOwpAQCAtNDUxLDYgKzQ3MCw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JoaWRfc3VibWl0X3JlcG9ydCk7CiAKIHN0YXRpYyBpbnQgdXNiX2hpZGlucHV0X2lucHV0X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCiB7CkBAIC00NjUsNyArNDg1LDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKChvZmZzZXQgPSBoaWRpbnB1dF9maW5kX2ZpZWxkKGhpZCwgdHlwZSwgY29kZSwgJmZpZWxkKSkgPT0gLTEpIHsKLQkJd2FybigiZXZlbnQgZmllbGQgbm90IGZvdW5kIik7CisJCWRldl93YXJuKCZkZXYtPmRldiwgImV2ZW50IGZpZWxkIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTU2OCw3ICs1ODgsNyBAQAogCX0KIAogCWlmIChlcnIpCi0JCXdhcm4oInRpbWVvdXQgaW5pdGlhbGl6aW5nIHJlcG9ydHMiKTsKKwkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAidGltZW91dCBpbml0aWFsaXppbmcgcmVwb3J0c1xuIik7CiB9CiAKIC8qCkBAIC01OTgsNyArNjE4LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYmhpZF9zZXRfbGVkcyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQordm9pZCB1c2JoaWRfc2V0X2xlZHMoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZDsKIAlpbnQgb2Zmc2V0OwpAQCAtNjA4LDYgKzYyOCw3IEBACiAJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZmllbGQtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYmhpZF9zZXRfbGVkcyk7CiAKIC8qCiAgKiBUcmF2ZXJzZSB0aGUgc3VwcGxpZWQgbGlzdCBvZiByZXBvcnRzIGFuZCBmaW5kIHRoZSBsb25nZXN0CkBAIC02NzUsNDMgKzY5NiwxNiBAQAogCXVzYl9idWZmZXJfZnJlZShkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgdXNiaGlkLT5jdHJsYnVmLCB1c2JoaWQtPmN0cmxidWZfZG1hKTsKIH0KIAotLyoKLSAqIFNlbmRpbmcgSElEX1JFUV9HRVRfUkVQT1JUIGNoYW5nZXMgdGhlIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBwczMgY29udHJvbGxlcgotICogdG8gIm9wZXJhdGlvbmFsIi4gIFdpdGhvdXQgdGhpcywgdGhlIHBzMyBjb250cm9sbGVyIHdpbGwgbm90IHJlcG9ydCBhbnkKLSAqIGV2ZW50cy4KLSAqLwotc3RhdGljIHZvaWQgaGlkX2ZpeHVwX3NvbnlfcHMzX2NvbnRyb2xsZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtKQorc3RhdGljIGludCB1c2JoaWRfcGFyc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKLQlpbnQgcmVzdWx0OwotCWNoYXIgKmJ1ZiA9IGttYWxsb2MoMTgsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFidWYpCi0JCXJldHVybjsKLQotCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAotCQkJCSBISURfUkVRX0dFVF9SRVBPUlQsCi0JCQkJIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8Ci0JCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsCi0JCQkJICgzIDw8IDgpIHwgMHhmMiwgaWZudW0sIGJ1ZiwgMTcsCi0JCQkJIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKLQotCWlmIChyZXN1bHQgPCAwKQotCQllcnJfaGlkKCIlcyBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKLQotCWtmcmVlKGJ1Zik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGlkX2RldmljZSAqdXNiX2hpZF9jb25maWd1cmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhpZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOwogCXN0cnVjdCBoaWRfZGVzY3JpcHRvciAqaGRlc2M7Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZDsKIAl1MzIgcXVpcmtzID0gMDsKLQl1bnNpZ25lZCBpbnQgaW5zaXplID0gMCwgcnNpemUgPSAwOworCXVuc2lnbmVkIGludCByc2l6ZSA9IDA7CiAJY2hhciAqcmRlc2M7Ci0JaW50IG4sIGxlbjsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkOworCWludCByZXQsIG47CiAKIAlxdWlya3MgPSB1c2JoaWRfbG9va3VwX3F1aXJrKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCQlsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CkBAIC03MjQsNjMgKzcxOCw3NSBAQAogCQkJCXF1aXJrcyB8PSBISURfUVVJUktfTk9HRVQ7CiAJfQogCi0JaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19JR05PUkUpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKChxdWlya3MgJiBISURfUVVJUktfSUdOT1JFX01PVVNFKSAmJgotCQkoaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSkKLQkJCXJldHVybiBOVUxMOwotCi0KIAlpZiAodXNiX2dldF9leHRyYV9kZXNjcmlwdG9yKGludGVyZmFjZSwgSElEX0RUX0hJRCwgJmhkZXNjKSAmJgogCSAgICAoIWludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzIHx8CiAJICAgICB1c2JfZ2V0X2V4dHJhX2Rlc2NyaXB0b3IoJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0sIEhJRF9EVF9ISUQsICZoZGVzYykpKSB7CiAJCWRiZ19oaWQoImNsYXNzIGRlc2NyaXB0b3Igbm90IHByZXNlbnRcbiIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJaGlkLT52ZXJzaW9uID0gbGUxNl90b19jcHUoaGRlc2MtPmJjZEhJRCk7CisJaGlkLT5jb3VudHJ5ID0gaGRlc2MtPmJDb3VudHJ5Q29kZTsKKwogCWZvciAobiA9IDA7IG4gPCBoZGVzYy0+Yk51bURlc2NyaXB0b3JzOyBuKyspCiAJCWlmIChoZGVzYy0+ZGVzY1tuXS5iRGVzY3JpcHRvclR5cGUgPT0gSElEX0RUX1JFUE9SVCkKIAkJCXJzaXplID0gbGUxNl90b19jcHUoaGRlc2MtPmRlc2Nbbl0ud0Rlc2NyaXB0b3JMZW5ndGgpOwogCiAJaWYgKCFyc2l6ZSB8fCByc2l6ZSA+IEhJRF9NQVhfREVTQ1JJUFRPUl9TSVpFKSB7CiAJCWRiZ19oaWQoIndlaXJkIHNpemUgb2YgcmVwb3J0IGRlc2NyaXB0b3IgKCV1KVxuIiwgcnNpemUpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKCEocmRlc2MgPSBrbWFsbG9jKHJzaXplLCBHRlBfS0VSTkVMKSkpIHsKIAkJZGJnX2hpZCgiY291bGRuJ3QgYWxsb2NhdGUgcmRlc2MgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWhpZF9zZXRfaWRsZShkZXYsIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwLCAwKTsKIAotCWlmICgobiA9IGhpZF9nZXRfY2xhc3NfZGVzY3JpcHRvcihkZXYsIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBISURfRFRfUkVQT1JULCByZGVzYywgcnNpemUpKSA8IDApIHsKKwlyZXQgPSBoaWRfZ2V0X2NsYXNzX2Rlc2NyaXB0b3IoZGV2LCBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwKKwkJCUhJRF9EVF9SRVBPUlQsIHJkZXNjLCByc2l6ZSk7CisJaWYgKHJldCA8IDApIHsKIAkJZGJnX2hpZCgicmVhZGluZyByZXBvcnQgZGVzY3JpcHRvciBmYWlsZWRcbiIpOwogCQlrZnJlZShyZGVzYyk7Ci0JCXJldHVybiBOVUxMOworCQlnb3RvIGVycjsKIAl9CiAKLQl1c2JoaWRfZml4dXBfcmVwb3J0X2Rlc2NyaXB0b3IobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJCWxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLCByZGVzYywKLQkJCXJzaXplLCByZGVzY19xdWlya3NfcGFyYW0pOwotCiAJZGJnX2hpZCgicmVwb3J0IGRlc2NyaXB0b3IgKHNpemUgJXUsIHJlYWQgJWQpID0gIiwgcnNpemUsIG4pOwogCWZvciAobiA9IDA7IG4gPCByc2l6ZTsgbisrKQogCQlkYmdfaGlkX2xpbmUoIiAlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpIHJkZXNjW25dKTsKIAlkYmdfaGlkX2xpbmUoIlxuIik7CiAKLQlpZiAoIShoaWQgPSBoaWRfcGFyc2VfcmVwb3J0KHJkZXNjLCBuKSkpIHsKKwlyZXQgPSBoaWRfcGFyc2VfcmVwb3J0KGhpZCwgcmRlc2MsIHJzaXplKTsKKwlrZnJlZShyZGVzYyk7CisJaWYgKHJldCkgewogCQlkYmdfaGlkKCJwYXJzaW5nIHJlcG9ydCBkZXNjcmlwdG9yIGZhaWxlZFxuIik7Ci0JCWtmcmVlKHJkZXNjKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZXJyOwogCX0KIAotCWtmcmVlKHJkZXNjKTsKIAloaWQtPnF1aXJrcyA9IHF1aXJrczsKIAotCWlmICghKHVzYmhpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JoaWRfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQotCQlnb3RvIGZhaWxfbm9fdXNiaGlkOworCXJldHVybiAwOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdXNiaGlkX3N0YXJ0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhpZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZDsKKwl1bnNpZ25lZCBpbnQgbiwgaW5zaXplID0gMDsKKwlpbnQgcmV0OworCisJV0FSTl9PTihoaWQtPmRyaXZlcl9kYXRhKTsKKworCXVzYmhpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JoaWRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVzYmhpZCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KIAogCWhpZC0+ZHJpdmVyX2RhdGEgPSB1c2JoaWQ7CiAJdXNiaGlkLT5oaWQgPSBoaWQ7CkBAIC03OTksMjggKzgwNSwxMSBAQAogCQlpbnNpemUgPSBISURfTUFYX0JVRkZFUl9TSVpFOwogCiAJaWYgKGhpZF9hbGxvY19idWZmZXJzKGRldiwgaGlkKSkgewotCQloaWRfZnJlZV9idWZmZXJzKGRldiwgaGlkKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KIAotCWhpZC0+bmFtZVswXSA9IDA7Ci0KLQlpZiAoZGV2LT5tYW51ZmFjdHVyZXIpCi0JCXN0cmxjcHkoaGlkLT5uYW1lLCBkZXYtPm1hbnVmYWN0dXJlciwgc2l6ZW9mKGhpZC0+bmFtZSkpOwotCi0JaWYgKGRldi0+cHJvZHVjdCkgewotCQlpZiAoZGV2LT5tYW51ZmFjdHVyZXIpCi0JCQlzdHJsY2F0KGhpZC0+bmFtZSwgIiAiLCBzaXplb2YoaGlkLT5uYW1lKSk7Ci0JCXN0cmxjYXQoaGlkLT5uYW1lLCBkZXYtPnByb2R1Y3QsIHNpemVvZihoaWQtPm5hbWUpKTsKLQl9Ci0KLQlpZiAoIXN0cmxlbihoaWQtPm5hbWUpKQotCQlzbnByaW50ZihoaWQtPm5hbWUsIHNpemVvZihoaWQtPm5hbWUpLCAiSElEICUwNHg6JTA0eCIsCi0JCQkgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7Ci0KIAlmb3IgKG4gPSAwOyBuIDwgaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHM7IG4rKykgewotCiAJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJCWludCBwaXBlOwogCQlpbnQgaW50ZXJ2YWw7CkBAIC04MzIsNyArODIxLDcgQEAKIAkJaW50ZXJ2YWwgPSBlbmRwb2ludC0+YkludGVydmFsOwogCiAJCS8qIFNvbWUgdmVuZG9ycyBnaXZlIGZ1bGxzcGVlZCBpbnRlcnZhbCBvbiBoaWdoc3BlZWQgZGV2aWRlcyAqLwotCQlpZiAocXVpcmtzICYgSElEX1FVSVJLX0ZVTExTUEVFRF9JTlRFUlZBTCAgJiYKKwkJaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0ZVTExTUEVFRF9JTlRFUlZBTCAmJgogCQkgICAgZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgewogCQkJaW50ZXJ2YWwgPSBmbHMoZW5kcG9pbnQtPmJJbnRlcnZhbCo4KTsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGaXhpbmcgZnVsbHNwZWVkIHRvIGhpZ2hzcGVlZCBpbnRlcnZhbDogJWQgLT4gJWRcbiIsCkBAIC04NDMsNiArODMyLDcgQEAKIAkJaWYgKGhpZC0+Y29sbGVjdGlvbi0+dXNhZ2UgPT0gSElEX0dEX01PVVNFICYmIGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWwgPiAwKQogCQkJaW50ZXJ2YWwgPSBoaWRfbW91c2Vwb2xsX2ludGVydmFsOwogCisJCXJldCA9IC1FTk9NRU07CiAJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGVuZHBvaW50KSkgewogCQkJaWYgKHVzYmhpZC0+dXJiaW4pCiAJCQkJY29udGludWU7CkBAIC04NjgsNiArODU4LDcgQEAKIAogCWlmICghdXNiaGlkLT51cmJpbikgewogCQllcnJfaGlkKCJjb3VsZG4ndCBmaW5kIGFuIGlucHV0IGludGVycnVwdCBlbmRwb2ludCIpOworCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC04NzksNDQgKzg3MCwyNSBAQAogCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPm91dGxvY2spOwogCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPmN0cmxsb2NrKTsKIAotCWhpZC0+dmVyc2lvbiA9IGxlMTZfdG9fY3B1KGhkZXNjLT5iY2RISUQpOwotCWhpZC0+Y291bnRyeSA9IGhkZXNjLT5iQ291bnRyeUNvZGU7Ci0JaGlkLT5kZXYgPSAmaW50Zi0+ZGV2OwogCXVzYmhpZC0+aW50ZiA9IGludGY7CiAJdXNiaGlkLT5pZm51bSA9IGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwogCi0JaGlkLT5idXMgPSBCVVNfVVNCOwotCWhpZC0+dmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKLQloaWQtPnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKLQotCXVzYl9tYWtlX3BhdGgoZGV2LCBoaWQtPnBoeXMsIHNpemVvZihoaWQtPnBoeXMpKTsKLQlzdHJsY2F0KGhpZC0+cGh5cywgIi9pbnB1dCIsIHNpemVvZihoaWQtPnBoeXMpKTsKLQlsZW4gPSBzdHJsZW4oaGlkLT5waHlzKTsKLQlpZiAobGVuIDwgc2l6ZW9mKGhpZC0+cGh5cykgLSAxKQotCQlzbnByaW50ZihoaWQtPnBoeXMgKyBsZW4sIHNpemVvZihoaWQtPnBoeXMpIC0gbGVuLAotCQkJICIlZCIsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKLQotCWlmICh1c2Jfc3RyaW5nKGRldiwgZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIGhpZC0+dW5pcSwgNjQpIDw9IDApCi0JCWhpZC0+dW5pcVswXSA9IDA7Ci0KIAl1c2JoaWQtPnVyYmN0cmwgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghdXNiaGlkLT51cmJjdHJsKQorCWlmICghdXNiaGlkLT51cmJjdHJsKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKKwl9CiAKIAl1c2JfZmlsbF9jb250cm9sX3VyYih1c2JoaWQtPnVyYmN0cmwsIGRldiwgMCwgKHZvaWQgKikgdXNiaGlkLT5jciwKIAkJCSAgICAgdXNiaGlkLT5jdHJsYnVmLCAxLCBoaWRfY3RybCwgaGlkKTsKIAl1c2JoaWQtPnVyYmN0cmwtPnNldHVwX2RtYSA9IHVzYmhpZC0+Y3JfZG1hOwogCXVzYmhpZC0+dXJiY3RybC0+dHJhbnNmZXJfZG1hID0gdXNiaGlkLT5jdHJsYnVmX2RtYTsKIAl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2ZsYWdzIHw9IChVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCB8IFVSQl9OT19TRVRVUF9ETUFfTUFQKTsKLQloaWQtPmhpZGlucHV0X2lucHV0X2V2ZW50ID0gdXNiX2hpZGlucHV0X2lucHV0X2V2ZW50OwotCWhpZC0+aGlkX29wZW4gPSB1c2JoaWRfb3BlbjsKLQloaWQtPmhpZF9jbG9zZSA9IHVzYmhpZF9jbG9zZTsKLSNpZmRlZiBDT05GSUdfVVNCX0hJRERFVgotCWhpZC0+aGlkZGV2X2hpZF9ldmVudCA9IGhpZGRldl9oaWRfZXZlbnQ7Ci0JaGlkLT5oaWRkZXZfcmVwb3J0X2V2ZW50ID0gaGlkZGV2X3JlcG9ydF9ldmVudDsKLSNlbmRpZgotCWhpZC0+aGlkX291dHB1dF9yYXdfcmVwb3J0ID0gdXNiaGlkX291dHB1dF9yYXdfcmVwb3J0OwotCXJldHVybiBoaWQ7CisKKwl1c2JoaWRfaW5pdF9yZXBvcnRzKGhpZCk7CisJaGlkX2R1bXBfZGV2aWNlKGhpZCk7CisKKwlyZXR1cm4gMDsKIAogZmFpbDoKIAl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJpbik7CkBAIC05MjQsMjQgKzg5NiwxOCBAQAogCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmN0cmwpOwogCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOwogCWtmcmVlKHVzYmhpZCk7Ci1mYWlsX25vX3VzYmhpZDoKLQloaWRfZnJlZV9kZXZpY2UoaGlkKTsKLQotCXJldHVybiBOVUxMOworZXJyOgorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGhpZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIHZvaWQgdXNiaGlkX3N0b3Aoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZDsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAotCWlmICghaGlkKQorCWlmIChXQVJOX09OKCF1c2JoaWQpKQogCQlyZXR1cm47CiAKLQl1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwotCiAJc3Bpbl9sb2NrX2lycSgmdXNiaGlkLT5pbmxvY2spOwkvKiBTeW5jIHdpdGggZXJyb3IgaGFuZGxlciAqLwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJc2V0X2JpdChISURfRElTQ09OTkVDVEVELCAmdXNiaGlkLT5pb2ZsKTsKIAlzcGluX3VubG9ja19pcnEoJnVzYmhpZC0+aW5sb2NrKTsKIAl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJpbik7CkBAIC05NTgsODYgKzkyNCwxMDAgQEAKIAlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEUkFXKQogCQloaWRyYXdfZGlzY29ubmVjdChoaWQpOwogCisJaGlkLT5jbGFpbWVkID0gMDsKKwogCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmluKTsKIAl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJjdHJsKTsKIAl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJvdXQpOwogCiAJaGlkX2ZyZWVfYnVmZmVycyhoaWRfdG9fdXNiX2RldihoaWQpLCBoaWQpOwogCWtmcmVlKHVzYmhpZCk7Ci0JaGlkX2ZyZWVfZGV2aWNlKGhpZCk7CisJaGlkLT5kcml2ZXJfZGF0YSA9IE5VTEw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaGlkX2xsX2RyaXZlciB1c2JfaGlkX2RyaXZlciA9IHsKKwkucGFyc2UgPSB1c2JoaWRfcGFyc2UsCisJLnN0YXJ0ID0gdXNiaGlkX3N0YXJ0LAorCS5zdG9wID0gdXNiaGlkX3N0b3AsCisJLm9wZW4gPSB1c2JoaWRfb3BlbiwKKwkuY2xvc2UgPSB1c2JoaWRfY2xvc2UsCisJLmhpZGlucHV0X2lucHV0X2V2ZW50ID0gdXNiX2hpZGlucHV0X2lucHV0X2V2ZW50LAorfTsKKwogc3RhdGljIGludCBoaWRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOwotCWNoYXIgcGF0aFs2NF07Ci0JaW50IGk7Ci0JY2hhciAqYzsKKwlzaXplX3QgbGVuOworCWludCByZXQ7CiAKIAlkYmdfaGlkKCJISUQgcHJvYmUgY2FsbGVkIGZvciBpZm51bSAlZFxuIiwKIAkJCWludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAKLQlpZiAoIShoaWQgPSB1c2JfaGlkX2NvbmZpZ3VyZShpbnRmKSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JdXNiaGlkX2luaXRfcmVwb3J0cyhoaWQpOwotCWhpZF9kdW1wX2RldmljZShoaWQpOwotCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19SRVNFVF9MRURTKQotCQl1c2JoaWRfc2V0X2xlZHMoaGlkKTsKLQotCWlmICghaGlkaW5wdXRfY29ubmVjdChoaWQpKQotCQloaWQtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSU5QVVQ7Ci0JaWYgKCFoaWRkZXZfY29ubmVjdChoaWQpKQotCQloaWQtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSElEREVWOwotCWlmICghaGlkcmF3X2Nvbm5lY3QoaGlkKSkKLQkJaGlkLT5jbGFpbWVkIHw9IEhJRF9DTEFJTUVEX0hJRFJBVzsKKwloaWQgPSBoaWRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKElTX0VSUihoaWQpKQorCQlyZXR1cm4gUFRSX0VSUihoaWQpOwogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBoaWQpOworCWhpZC0+bGxfZHJpdmVyID0gJnVzYl9oaWRfZHJpdmVyOworCWhpZC0+aGlkX291dHB1dF9yYXdfcmVwb3J0ID0gdXNiaGlkX291dHB1dF9yYXdfcmVwb3J0OworCWhpZC0+ZmZfaW5pdCA9IGhpZF9waWRmZl9pbml0OworI2lmZGVmIENPTkZJR19VU0JfSElEREVWCisJaGlkLT5oaWRkZXZfY29ubmVjdCA9IGhpZGRldl9jb25uZWN0OworCWhpZC0+aGlkZGV2X2hpZF9ldmVudCA9IGhpZGRldl9oaWRfZXZlbnQ7CisJaGlkLT5oaWRkZXZfcmVwb3J0X2V2ZW50ID0gaGlkZGV2X3JlcG9ydF9ldmVudDsKKyNlbmRpZgorCWhpZC0+ZGV2LnBhcmVudCA9ICZpbnRmLT5kZXY7CisJaGlkLT5idXMgPSBCVVNfVVNCOworCWhpZC0+dmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwloaWQtPnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwloaWQtPm5hbWVbMF0gPSAwOwogCi0JaWYgKCFoaWQtPmNsYWltZWQpIHsKLQkJcHJpbnRrICgiSElEIGRldmljZSBjbGFpbWVkIGJ5IG5laXRoZXIgaW5wdXQsIGhpZGRldiBub3IgaGlkcmF3XG4iKTsKLQkJaGlkX2Rpc2Nvbm5lY3QoaW50Zik7Ci0JCXJldHVybiAtRU5PREVWOworCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKKwkJc3RybGNweShoaWQtPm5hbWUsIGRldi0+bWFudWZhY3R1cmVyLCBzaXplb2YoaGlkLT5uYW1lKSk7CisKKwlpZiAoZGV2LT5wcm9kdWN0KSB7CisJCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKKwkJCXN0cmxjYXQoaGlkLT5uYW1lLCAiICIsIHNpemVvZihoaWQtPm5hbWUpKTsKKwkJc3RybGNhdChoaWQtPm5hbWUsIGRldi0+cHJvZHVjdCwgc2l6ZW9mKGhpZC0+bmFtZSkpOwogCX0KIAotCWlmICgoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpKQotCQloaWRfZmZfaW5pdChoaWQpOworCWlmICghc3RybGVuKGhpZC0+bmFtZSkpCisJCXNucHJpbnRmKGhpZC0+bmFtZSwgc2l6ZW9mKGhpZC0+bmFtZSksICJISUQgJTA0eDolMDR4IiwKKwkJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkJIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKIAotCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19TT05ZX1BTM19DT05UUk9MTEVSKQotCQloaWRfZml4dXBfc29ueV9wczNfY29udHJvbGxlcihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLAotCQkJaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisJdXNiX21ha2VfcGF0aChkZXYsIGhpZC0+cGh5cywgc2l6ZW9mKGhpZC0+cGh5cykpOworCXN0cmxjYXQoaGlkLT5waHlzLCAiL2lucHV0Iiwgc2l6ZW9mKGhpZC0+cGh5cykpOworCWxlbiA9IHN0cmxlbihoaWQtPnBoeXMpOworCWlmIChsZW4gPCBzaXplb2YoaGlkLT5waHlzKSAtIDEpCisJCXNucHJpbnRmKGhpZC0+cGh5cyArIGxlbiwgc2l6ZW9mKGhpZC0+cGh5cykgLSBsZW4sCisJCQkgIiVkIiwgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyk7CisJaWYgKHVzYl9zdHJpbmcoZGV2LCBkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgaGlkLT51bmlxLCA2NCkgPD0gMCkKKwkJaGlkLT51bmlxWzBdID0gMDsKIAotCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkKLQkJcHJpbnRrKCJpbnB1dCIpOwotCWlmICgoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpICYmICgoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWKSB8fAotCQkJCWhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRFJBVykpCi0JCXByaW50aygiLCIpOwotCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYpCi0JCXByaW50aygiaGlkZGV2JWQiLCBoaWQtPm1pbm9yKTsKLQlpZiAoKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKSAmJiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWKSAmJgotCQkJKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRFJBVykpCi0JCXByaW50aygiLCIpOwotCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURSQVcpCi0JCXByaW50aygiaGlkcmF3JWQiLCAoKHN0cnVjdCBoaWRyYXcqKWhpZC0+aGlkcmF3KS0+bWlub3IpOwotCi0JYyA9ICJEZXZpY2UiOwotCWZvciAoaSA9IDA7IGkgPCBoaWQtPm1heGNvbGxlY3Rpb247IGkrKykgewotCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0gSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gJiYKLQkJICAgIChoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0dFTkRFU0sgJiYKLQkJICAgIChoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UgJiAweGZmZmYpIDwgQVJSQVlfU0laRShoaWRfdHlwZXMpKSB7Ci0JCQljID0gaGlkX3R5cGVzW2hpZC0+Y29sbGVjdGlvbltpXS51c2FnZSAmIDB4ZmZmZl07Ci0JCQlicmVhazsKLQkJfQorCXJldCA9IGhpZF9hZGRfZGV2aWNlKGhpZCk7CisJaWYgKHJldCkgeworCQlpZiAocmV0ICE9IC1FTk9ERVYpCisJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjYW4ndCBhZGQgaGlkIGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOwogCX0KIAotCXVzYl9tYWtlX3BhdGgoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgcGF0aCwgNjMpOwotCi0JcHJpbnRrKCI6IFVTQiBISUQgdiV4LiUwMnggJXMgWyVzXSBvbiAlc1xuIiwKLQkJaGlkLT52ZXJzaW9uID4+IDgsIGhpZC0+dmVyc2lvbiAmIDB4ZmYsIGMsIGhpZC0+bmFtZSwgcGF0aCk7Ci0KIAlyZXR1cm4gMDsKK2VycjoKKwloaWRfZGVzdHJveV9kZXZpY2UoaGlkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBoaWRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWlmIChXQVJOX09OKCFoaWQpKQorCQlyZXR1cm47CisKKwloaWRfZGVzdHJveV9kZXZpY2UoaGlkKTsKIH0KIAogc3RhdGljIGludCBoaWRfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCkBAIC0xMTA3LDkgKzEwODcsMjIgQEAKIAkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGhpZF91c2JfdGFibGVbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKEhJRF9BTllfSUQsIEhJRF9BTllfSUQpIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgaGlkX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZ2VuZXJpYy11c2IiLAorCS5pZF90YWJsZSA9IGhpZF91c2JfdGFibGUsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBoaWRfaW5pdCh2b2lkKQogewogCWludCByZXR2YWw7CisJcmV0dmFsID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmaGlkX3VzYl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gaGlkX3JlZ2lzdGVyX2ZhaWw7CiAJcmV0dmFsID0gdXNiaGlkX3F1aXJrc19pbml0KHF1aXJrc19wYXJhbSk7CiAJaWYgKHJldHZhbCkKIAkJZ290byB1c2JoaWRfcXVpcmtzX2luaXRfZmFpbDsKQEAgLTExMTksNyArMTExMiw4IEBACiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZoaWRfZHJpdmVyKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIHVzYl9yZWdpc3Rlcl9mYWlsOwotCWluZm8oRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDKTsKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJCQlEUklWRVJfREVTQyAiXG4iKTsKIAogCXJldHVybiAwOwogdXNiX3JlZ2lzdGVyX2ZhaWw6CkBAIC0xMTI3LDYgKzExMjEsOCBAQAogaGlkZGV2X2luaXRfZmFpbDoKIAl1c2JoaWRfcXVpcmtzX2V4aXQoKTsKIHVzYmhpZF9xdWlya3NfaW5pdF9mYWlsOgorCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmaGlkX3VzYl9kcml2ZXIpOworaGlkX3JlZ2lzdGVyX2ZhaWw6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTEzNSw2ICsxMTMxLDcgQEAKIAl1c2JfZGVyZWdpc3RlcigmaGlkX2RyaXZlcik7CiAJaGlkZGV2X2V4aXQoKTsKIAl1c2JoaWRfcXVpcmtzX2V4aXQoKTsKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmhpZF91c2JfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaGlkX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1mZi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDBkYWM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiAgRm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaGlkIGRldmljZXMuCi0gKiAgTm90IGFsbCBoaWQgZGV2aWNlcyB1c2UgdGhlIHNhbWUgcHJvdG9jb2wuIEZvciBleGFtcGxlLCBzb21lIHVzZSBQSUQsCi0gKiAgb3RoZXIgdXNlIHRoZWlyIG93biBwcm9wcmlldGFyeSBwcm9jb3RvbC4KLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSm9oYW5uIERlbmV1eAotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICoKLSAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGJ5Ci0gKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8am9oYW5uLmRlbmV1eEBpdC51dS5zZT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLQotI3VuZGVmIERFQlVHCi0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlICJ1c2JoaWQuaCIKLQotLyoKLSAqIFRoaXMgdGFibGUgY29udGFpbnMgcG9pbnRlcnMgdG8gaW5pdGlhbGl6ZXJzLiBUbyBhZGQgc3VwcG9ydCBmb3IgbmV3Ci0gKiBkZXZpY2VzLCB5b3UgbmVlZCB0byBhZGQgdGhlIFVTQiB2ZW5kb3IgYW5kIHByb2R1Y3QgaWRzIGhlcmUuCi0gKi8KLXN0cnVjdCBoaWRfZmZfaW5pdGlhbGl6ZXIgewotCXUxNiBpZFZlbmRvcjsKLQl1MTYgaWRQcm9kdWN0OwotCWludCAoKmluaXQpKHN0cnVjdCBoaWRfZGV2aWNlKik7Ci19OwotCi0vKgotICogV2UgdHJ5IHBpZGZmIHdoZW4gbm8gb3RoZXIgZHJpdmVyIGlzIGZvdW5kIGJlY2F1c2UgUElEIGlzIHRoZQotICogc3RhbmRhcmRzIGNvbXBsaWFudCB3YXkgb2YgaW1wbGVtZW50aW5nIGZvcmNlIGZlZWRiYWNrIGluIEhJRC4KLSAqIHBpZGZmX2luaXQoKSB3aWxsIHF1aWNrbHkgYWJvcnQgaWYgdGhlIGRldmljZSBkb2Vzbid0IGFwcGVhciB0bwotICogYmUgYSBQSUQgZGV2aWNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaGlkX2ZmX2luaXRpYWxpemVyIGluaXRzW10gPSB7Ci0jaWZkZWYgQ09ORklHX0xPR0lURUNIX0ZGCi0JeyAweDQ2ZCwgMHhjMjExLCBoaWRfbGdmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIENvcmRsZXNzIHJ1bWJsZSBwYWQgKi8KLQl7IDB4NDZkLCAweGMyMTksIGhpZF9sZ2ZmX2luaXQgfSwgLyogTG9naXRlY2ggQ29yZGxlc3MgcnVtYmxlIHBhZCAyICovCi0JeyAweDQ2ZCwgMHhjMjgzLCBoaWRfbGdmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIFdpbmdtYW4gRm9yY2UgM2QgKi8KLQl7IDB4NDZkLCAweGMyODYsIGhpZF9sZ2ZmX2luaXQgfSwgLyogTG9naXRlY2ggRm9yY2UgM0QgUHJvIEpveXN0aWNrICovCi0JeyAweDQ2ZCwgMHhjMjk0LCBoaWRfbGdmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIEZvcm11bGEgRm9yY2UgRVggKi8KLQl7IDB4NDZkLCAweGMyOTUsIGhpZF9sZ2ZmX2luaXQgfSwgLyogTG9naXRlY2ggTU9NTyBmb3JjZSB3aGVlbCAqLwotCXsgMHg0NmQsIDB4Y2EwMywgaGlkX2xnZmZfaW5pdCB9LCAvKiBMb2dpdGVjaCBNT01PIGZvcmNlIHdoZWVsICovCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYKLQl7IDB4NDZkLCAweGMyMTgsIGhpZF9sZzJmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIFJ1bWJsZXBhZCAyICovCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUEFOVEhFUkxPUkRfRkYKLQl7IDB4ODEwLCAweDAwMDEsIGhpZF9wbGZmX2luaXQgfSwgLyogIlR3aW4gVVNCIEpveXN0aWNrIiAqLwotCXsgMHhlOGYsIDB4MDAwMywgaGlkX3BsZmZfaW5pdCB9LCAvKiAiR3JlZW5Bc2lhIEluYy4gICAgVVNCIEpveXN0aWNrICAgICAiICovCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVEhSVVNUTUFTVEVSX0ZGCi0JeyAweDQ0ZiwgMHhiMzAwLCBoaWRfdG1mZl9pbml0IH0sCi0JeyAweDQ0ZiwgMHhiMzA0LCBoaWRfdG1mZl9pbml0IH0sCi0JeyAweDQ0ZiwgMHhiNjUxLCBoaWRfdG1mZl9pbml0IH0sIC8qIEZHVCBSdW1ibGUgRm9yY2UgV2hlZWwgKi8KLQl7IDB4NDRmLCAweGI2NTQsIGhpZF90bWZmX2luaXQgfSwgLyogRkdUIEZvcmNlIEZlZWRiYWNrIFdoZWVsICovCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfWkVST1BMVVNfRkYKLQl7IDB4YzEyLCAweDAwMDUsIGhpZF96cGZmX2luaXQgfSwKLQl7IDB4YzEyLCAweDAwMzAsIGhpZF96cGZmX2luaXQgfSwKLSNlbmRpZgotCXsgMCwJIDAsCSBoaWRfcGlkZmZfaW5pdH0gIC8qIE1hdGNoZXMgYW55dGhpbmcgKi8KLX07Ci0KLWludCBoaWRfZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSogaGlkKQotewotCXN0cnVjdCBoaWRfZmZfaW5pdGlhbGl6ZXIgKmluaXQ7Ci0JaW50IHZlbmRvciA9IGxlMTZfdG9fY3B1KGhpZF90b191c2JfZGV2KGhpZCktPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotCWludCBwcm9kdWN0ID0gbGUxNl90b19jcHUoaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwotCi0JZm9yIChpbml0ID0gaW5pdHM7IGluaXQtPmlkVmVuZG9yOyBpbml0KyspCi0JCWlmIChpbml0LT5pZFZlbmRvciA9PSB2ZW5kb3IgJiYgaW5pdC0+aWRQcm9kdWN0ID09IHByb2R1Y3QpCi0JCQlicmVhazsKLQotCXJldHVybiBpbml0LT5pbml0KGhpZCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChoaWRfZmZfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYwppbmRleCAwMTEzMjYxLi40ODRlM2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCkBAIC0zOTcsNyArMzk3LDYgQEAKIAkJCSAgZWZmZWN0LT51LmNvbmRpdGlvbltpXS5sZWZ0X3NhdHVyYXRpb24pOwogCQlwaWRmZl9zZXQoJnBpZGZmLT5zZXRfY29uZGl0aW9uW1BJRF9ERUFEX0JBTkRdLAogCQkJICBlZmZlY3QtPnUuY29uZGl0aW9uW2ldLmRlYWRiYW5kKTsKLQkJdXNiaGlkX3dhaXRfaW8ocGlkZmYtPmhpZCk7CiAJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9TRVRfQ09ORElUSU9OXSwKIAkJCQkgIFVTQl9ESVJfT1VUKTsKIAl9CkBAIC01MTIsNyArNTExLDYgQEAKIAkJcGlkZmYtPmVmZmVjdF9vcGVyYXRpb25bUElEX0xPT1BfQ09VTlRdLnZhbHVlWzBdID0gbjsKIAl9CiAKLQl1c2JoaWRfd2FpdF9pbyhwaWRmZi0+aGlkKTsKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfRUZGRUNUX09QRVJBVElPTl0sCiAJCQkgIFVTQl9ESVJfT1VUKTsKIH0KQEAgLTU0OCw2ICs1NDYsOSBAQAogCWludCBwaWRfaWQgPSBwaWRmZi0+cGlkX2lkW2VmZmVjdF9pZF07CiAKIAlkZWJ1Zygic3RhcnRpbmcgdG8gZXJhc2UgJWQvJWQiLCBlZmZlY3RfaWQsIHBpZGZmLT5waWRfaWRbZWZmZWN0X2lkXSk7CisJLyogV2FpdCBmb3IgdGhlIHF1ZXVlIHRvIGNsZWFyLiBXZSBkbyBub3Qgd2FudCBhIGZ1bGwgZmlmbyB0bworCSAgIHByZXZlbnQgdGhlIGVmZmVjdCByZW1vdmFsLiAqLworCXVzYmhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOwogCXBpZGZmX3BsYXliYWNrX3BpZChwaWRmZiwgcGlkX2lkLCAwKTsKIAlwaWRmZl9lcmFzZV9waWQocGlkZmYsIHBpZF9pZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCmluZGV4IGIxNWY4ODIuLjQ3ZWJlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwpAQCAtMTcsNDEyICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0E0VEVDSAkJMHgwOWRhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQTRURUNIX1dDUDMyUFUJMHgwMDA2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQTRURUNIX1g1XzAwNUQJMHgwMDBhCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQVNISU1BCQkweDA2ZDYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQVNISU1BX0dBTUVQQUQJMHgwMDI1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9QUkVEQVRPUgkweDAwMjYKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FDRUNBRAkJMHgwNDYwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUNFQ0FEX0ZMQUlSCTB4MDAwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FDRUNBRF8zMDIJMHgwMDA4Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BRFNfVEVDSCAJCTB4MDZlMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FEU19URUNIX1JBRElPX1NJNDcwWAkweGExNTUKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FGQVRFQ0gJCTB4MTVhNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FGQVRFQ0hfQUY5MDE2CTB4OTAxNgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlQVEVLCQkweDA4Y2EKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMDEJCTB4MDAwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18xMAkJMHgwMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIwCQkweDAwMjAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjEJCTB4MDAyMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yMgkJMHgwMDIyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIzCQkweDAwMjMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjQJCTB4MDAyNAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlSQ0FCTEUJCTB4MTZDQQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMQkJMHgxNTAyCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BTENPUgkJMHgwNThmCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUxDT1JfVVNCUlMyMzIJMHg5NzIwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BTFBTCQkweDA0MzMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9JQk1fR0FNRVBBRAkweDExMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FQUExFCQkweDA1YWMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9NSUdIVFlNT1VTRQkweDAzMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJCTB4MDIwZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0lTTwkweDAyMGYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSQkweDAyMTQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPCTB4MDIxNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMJMHgwMjE2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19BTlNJCTB4MDIxNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSVNPCTB4MDIxOAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTCTB4MDIxOQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfQU5TSQkweDAyMWEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0lTTwkweDAyMWIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUwkweDAyMWMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfQU5TSQkweDAyMjAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfSVNPCTB4MDIyMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9KSVMJMHgwMjIyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklOR19BTlNJCTB4MDIyMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSVNPCTB4MDIyNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSklTCTB4MDIyNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfQU5TSSAgICAweDAyMjkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0lTTyAgICAgMHgwMjJhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9KSVMgICAgIDB4MDIyYgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19BTlNJICAweDAyMmMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfSVNPICAgMHgwMjJkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0pJUyAgIDB4MDIyZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0FOU0kJMHgwMjMwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSVNPCTB4MDIzMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0pJUwkweDAyMzIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZCTB4MDMwYQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWQkweDAzMGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9JUkNPTlRST0w0CTB4ODI0MgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQVNVUwkJMHgwYjA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVNVU19MQ00JCTB4MTcyNgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQVRFTgkJMHgwNTU3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNCTB4MjAwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fQ1MxMjRVCTB4MjIwMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fMlBPUlRLVk0JMHgyMjA0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl80UE9SVEtWTQkweDIyMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNQwkweDIyMDgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFTEtJTiAgICAgICAgICAgMHgwNTBkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0gICAgICAgICAweDMyMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFUktTSElSRQkJMHgwYzk4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QJMHgxMTQwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSEVSUlkJCTB4MDQ2YQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTgkweDAwMjMKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0NISUMJCTB4MDVmZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNfR0FNRVBBRAkweDAwMTQKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0NJREMJCTB4MTY3NwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ01FRElBCQkweDBkOGMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DTTEwOQkJMHgwMDBlCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DT0RFTUVSQ1MJCTB4MDdjMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfRklSU1QJMHgxNTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPV19MQVNUCTB4MTVmZgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1lHTkFMCQkweDEwYzQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWUdOQUxfUkFESU9fU0k0NzBYCTB4ODE4YQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1lQUkVTUwkJMHgwNGI0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19NT1VTRQkweDAwMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTQkweDU1MDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX1VMVFJBTU9VU0UJMHg3NDE3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEJMHhkZTYxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIJMHhkZTY0Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ERUxMCQkweDQxM2MKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4CTB4MjAwNQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfREVMT1JNRQkJMHgxMTYzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FQVJUSE1BVEUgMHgwMTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FTV9MVDIwCTB4MDIwMAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfRE1JCQkweDBjMGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ETUlfRU5DCQkweDVmYWIKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0VMTwkJMHgwNEU3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfRUxPX1RTMjcwMAkweDAwMjAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZCTB4MGQ3ZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1IDB4MDEwMAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfRVpLRVkgCQkweDA1MTgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9CVENfODE5MwkJMHgwMDAyCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HQU1FUk9OCQkweDA4MTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUFNYX0FEQVBUT1IJMHgwMDAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNICTB4MGRmYwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfR0xBQgkJMHgwNmMyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMzAJMHgwMDM4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMzAJMHgwMDM5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF8wXzRfSUZfS0lUCTB4MDA0MAotI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfMTZfMTZfSUZfS0lUCTB4MDA0NAotI2RlZmluZSBVU0JfREVWSUNFX0lEXzhfOF84X0lGX0tJVAkweDAwNDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzhfN19JRl9LSVQJMHgwMDUxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF84XzhfSUZfS0lUCTB4MDA1MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BISURHRVRfTU9UT1JDT05UUk9MCTB4MDA1OAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfR09UT1AJCTB4MDhmMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX1NVUEVSX1EyCQkweDAwN2YKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HT0dPUEVOCQkweDAwY2UKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9QRU5QT1dFUgkJMHgwMGY0Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HUkVUQUdNQUNCRVRICTB4MDk3MQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dSRVRBR01BQ0JFVEhfSFVFWQkweDIwMDUKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0dSSUZGSU4JCTB4MDc3ZAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPV0VSTUFURQkJMHgwNDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09VTkRLTk9CCQkweDA0QUEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0dUQ08JCTB4MDc4YwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fOTAJCTB4MDA5MAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwCQkweDAxMDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMQkJMHgwMTAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDMJCTB4MDEwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA0CQkweDAxMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwNQkJMHgwMTA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDYJCTB4MDEwNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA3CQkweDAxMDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwOAkJMHgwMTA4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDAJCTB4MDIwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjAxCQkweDAyMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMgkJMHgwMjAyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDMJCTB4MDIwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA0CQkweDAyMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwNQkJMHgwMjA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDYJCTB4MDIwNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA3CQkweDAyMDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMAkJMHgwMzAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDEJCTB4MDMwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAyCQkweDAzMDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMwkJMHgwMzAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDQJCTB4MDMwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA1CQkweDAzMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNgkJMHgwMzA2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDcJCTB4MDMwNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA4CQkweDAzMDgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwOQkJMHgwMzA5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDAJCTB4MDQwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDAxCQkweDA0MDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMgkJMHgwNDAyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDMJCTB4MDQwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDA0CQkweDA0MDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwNQkJMHgwNDA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDAJCTB4MDUwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAxCQkweDA1MDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMgkJMHgwNTAyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDMJCTB4MDUwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTA0CQkweDA1MDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDAJCTB4MTAwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMQkJMHgxMDAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAyCQkweDEwMDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDMJCTB4MTAwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNAkJMHgxMDA0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA1CQkweDEwMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDYJCTB4MTAwNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNwkJMHgxMDA3Ci0jZGVmaW5lIFVTQl9WRU5ET1JfSURfSEFQUAkJMHgwNzhiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9EUklWSU5HCTB4MDAxMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRkxZSU5HCTB4MDAyMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRklHSFRJTkcJMHgwMDMwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9JTUFUSU9OCQkweDA3MTgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQQkweGQwMDAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0tCR0VBUgkJMHgwODRlCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTwkweDEwMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0xECQkweDBmMTEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9DQVNTWQkJMHgxMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfUE9DS0VUQ0FTU1kJMHgxMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTU9CSUxFQ0FTU1kJMHgxMDIwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfSldNCQkweDEwODAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9ETU1QCQkweDEwODEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9VTUlQCQkweDEwOTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9YUkFZMQkJMHgxMTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfWFJBWTIJCTB4MTEwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1ZJREVPQ09NCTB4MTIwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIJMHgyMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQJMHgyMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTkVUV09SS0FOQUxZU0VSIDB4MjAyMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTAkweDIwMzAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVAkweDIwNDAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0xPR0lURUNICQkweDA0NmQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9MWDMJMHhjMDQ0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfVjE1MAkweGMwNDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SRUNFSVZFUgkweGMxMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZICAweGMxMTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIgMHhjMTExCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zIDB4YzExMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNCAweGMxMTMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUgMHhjMTE0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82IDB4YzExNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNyAweGMxMTYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzggMHhjMTE3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV85IDB4YzExOAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTAgMHhjMTE5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xMSAweGMxMWEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzEyIDB4YzExYgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTMgMHhjMTFjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNCAweGMxMWQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE1IDB4YzExZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTYgMHhjMTFmCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNyAweGMxMjAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE4IDB4YzEyMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTkgMHhjMTIyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMCAweGMxMjMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIxIDB4YzEyNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjIgMHhjMTI1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMyAweGMxMjYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI0IDB4YzEyNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjUgMHhjMTI4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yNiAweGMxMjkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI3IDB4YzEyYQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjggMHhjMTJiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yOSAweGMxMmMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMwIDB4YzEyZAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzEgMHhjMTJlCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zMiAweGMxMmYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMzIDB4YzEzMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzQgMHhjMTMxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zNSAweGMxMzIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM2IDB4YzEzMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzcgMHhjMTM0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zOCAweGMxMzUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM5IDB4YzEzNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDAgMHhjMTM3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80MSAweGMxMzgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQyIDB4YzEzOQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDMgMHhjMTNhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NCAweGMxM2IKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ1IDB4YzEzYwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDYgMHhjMTNkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NyAweGMxM2UKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ4IDB4YzEzZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDkgMHhjMTQwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MCAweGMxNDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUxIDB4YzE0MgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTIgMHhjMTQzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MyAweGMxNDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU0IDB4YzE0NQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTUgMHhjMTQ2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81NiAweGMxNDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU3IDB4YzE0OAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTggMHhjMTQ5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81OSAweGMxNGEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYwIDB4YzE0YgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjEgMHhjMTRjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82MiAweGMxNGQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYzIDB4YzE0ZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjQgMHhjMTRmCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRVhUUkVNRV8zRAkweGMyMTUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTAkweGMyOTQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FTElURV9LQkQJMHhjMzBhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfS0JECTB4YzMxMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVIJMHhjNTBjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yCTB4YzUxNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDAJMHhjNTEyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSCTB4YzUxMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19ERVNLVE9QCTB4YzcwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19FREdFCTB4YzcxNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19NSU5JCTB4YzcxZgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTUNDCQkweDA5ZGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTAyNExTCTB4MDA3NgotI2RlZmluZSBVU0JfREVWSUNFX0lEX01DQ19QTUQxMjA4TFMJMHgwMDdhCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NR0UJCTB4MDQ2MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMJCTB4ZmZmZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMxCQkweDAwMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUAkJMHgwNGQ4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUElDS0lUMQkJMHgwMDMyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUElDS0lUMgkJMHgwMDMzCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQJCTB4MDQ1ZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX1NJREVXSU5ERVJfR1YJMHgwMDNiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfV0lSRUxFU1NfT1BUSUNBTF9ERVNLVE9QXzNfMCAweDAwOWQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERVNLVE9QX1JFQ1ZfMTAyOCAweDAwZjkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19ORTRLCQkweDAwZGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19MSzZLCQkweDAwZjkKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX01PTlRFUkVZCQkweDA1NjYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUJMHgzMDA0Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OQ1IJCTB4MDQwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX05DUl9GSVJTVAkJMHgwMzAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkNSX0xBU1QJCTB4MDNmZgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTkFUSU9OQUxfU0VNSUNPTkRVQ1RPUiAweDA0MDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9OX1NfSEFSTU9OWSAgICAgICAweGMzNTkKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX05BVFNVICAgICAgICAgICAgIDB4MDhiNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX05BVFNVX0dBTUVQQUQgICAgIDB4MDAwMQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTkVDCQkweDA3M2UKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORUNfVVNCX0dBTUVfUEFECTB4MDMwMQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfT05UUkFLCQkweDBhMDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwCTB4MDA2NAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfUEFOSklUCQkweDEzNGMKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1BBTlRIRVJMT1JECTB4MDgxMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BBTlRIRVJMT1JEX1RXSU5fVVNCX0pPWVNUSUNLCTB4MDAwMQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfUEVUQUxZTlgJCTB4MThiMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUJMHgwMDM3Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QTEFZRE9UQ09NCTB4MGI0MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BMQVlET1RDT01fRU1TX1VTQklJCTB4MDAwMwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FJVEVLCQkweDA2YTMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9TQUlURUtfUlVNQkxFUEFECTB4ZmYxNwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FNU1VORwkJMHgwNDE5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19JUl9SRU1PVEUJMHgwMDAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TT05ZCQkJMHgwNTRjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09OWV9QUzNfQ09OVFJPTExFUgkweDAyNjgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1NPVU5ER1JBUEgJMHgxNWMyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09VTkRHUkFQSF9JTU9OX0xDRAkweDAwMzgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1NVTgkJMHgwNDMwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFCTB4Y2RhYgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfU1VOUExVUwkJMHgwNGZjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU1VOUExVU19XREVTS1RPUAkweDA1ZDgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1RPUE1BWAkJMHgwNjYzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFECTB4MDEwMwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfVFVSQk9YCQkweDA2MmEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9UVVJCT1hfS0VZQk9BUkQJMHgwMjAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSCQkweDA4ZjcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0xBQlBSTwkweDAwMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0dPVEVNUAkweDAwMDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVAJMHgwMDAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9DWUNMT1BTCTB4MDAwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTENTUEVDCTB4MDAwNgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfV0FDT00JCTB4MDU2YQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfV0lTRUdST1VQCQkweDA5MjUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18yMAkweDgxMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18yMAkweDgxMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQJMHg4MjAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUVVBRF9VU0JfSk9ZUEFECTB4ODgwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RVQUxfVVNCX0pPWVBBRAkweDg4NjYKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUF9MVEQJMHg2Njc3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfRFVBTF9QTFVTIDB4ODgwMgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfWUVBTElOSwkJMHg2OTkzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfWUVBTElOS19QMUtfUDRLX0IySwkweGIwMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0tZRQkJMHgwNDU4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfS1lFX0dQRU5fNTYwCTB4NTAwMworI2luY2x1ZGUgIi4uL2hpZC1pZHMuaCIKIAogLyoKICAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KQEAgLTQzMywxOCArMjgsMTAgQEAKIAlfX3UxNiBpZFByb2R1Y3Q7CiAJX191MzIgcXVpcmtzOwogfSBoaWRfYmxhY2tsaXN0W10gPSB7Ci0KLQl7IFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVLCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNyB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BNFRFQ0gsIFVTQl9ERVZJQ0VfSURfQTRURUNIX1g1XzAwNUQsIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19COCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UsIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181IH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIsIEhJRF9RVUlSS19CQURfUkVMQVRJVkVfS0VZUyB9LAotCiAJeyBVU0JfVkVORE9SX0lEX0FBU0hJTUEsIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FBU0hJTUEsIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9QUkVEQVRPUiwgSElEX1FVSVJLX0JBRFBBRCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BTFBTLCBVU0JfREVWSUNFX0lEX0lCTV9HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX0NISUMsIFVTQl9ERVZJQ0VfSURfQ0hJQ19HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dBTUVST04sIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BTWF9BREFQVE9SLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0RSSVZJTkcsIEhJRF9RVUlSS19CQURQQUQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0ZMWUlORywgSElEX1FVSVJLX0JBRFBBRCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9IQVBQLCBVU0JfREVWSUNFX0lEX1VHQ0lfRklHSFRJTkcsIEhJRF9RVUlSS19CQURQQUQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKQEAgLTQ1MywxNjkgKzQwLDExIEBACiAJeyBVU0JfVkVORE9SX0lEX1NBSVRFSywgVVNCX0RFVklDRV9JRF9TQUlURUtfUlVNQkxFUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RPUE1BWCwgVVNCX0RFVklDRV9JRF9UT1BNQVhfQ09CUkFQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fREVTS1RPUCwgSElEX1FVSVJLX0RVUExJQ0FURV9VU0FHRVMgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX0VER0UsIEhJRF9RVUlSS19EVVBMSUNBVEVfVVNBR0VTIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19NSU5JLCBISURfUVVJUktfRFVQTElDQVRFX1VTQUdFUyB9LAotCiAJeyBVU0JfVkVORE9SX0lEX0FGQVRFQ0gsIFVTQl9ERVZJQ0VfSURfQUZBVEVDSF9BRjkwMTYsIEhJRF9RVUlSS19GVUxMU1BFRURfSU5URVJWQUwgfSwKIAotCXsgVVNCX1ZFTkRPUl9JRF9CRUxLSU4sIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0sIEhJRF9RVUlSS19ISURERVYgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfSVJDT05UUk9MNCwgSElEX1FVSVJLX0hJRERFViB8IEhJRF9RVUlSS19JR05PUkVfSElESU5QVVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSwgSElEX1FVSVJLX0hJRERFViB8IEhJRF9RVUlSS19JR05PUkVfSElESU5QVVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX1NJREVXSU5ERVJfR1YsIEhJRF9RVUlSS19ISURJTlBVVCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0VaS0VZLCBVU0JfREVWSUNFX0lEX0JUQ184MTkzLCBISURfUVVJUktfSFdIRUVMX1dIRUVMX0lOVkVSVCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FEU19URUNILCBVU0JfREVWSUNFX0lEX0FEU19URUNIX1JBRElPX1NJNDcwWCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMTAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUkNBQkxFLCBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BTENPUiwgVVNCX0RFVklDRV9JRF9BTENPUl9VU0JSUzIzMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BU1VTLCBVU0JfREVWSUNFX0lEX0FTVVNfTENNLCBISURfUVVJUktfSUdOT1JFfSwKLQl7IFVTQl9WRU5ET1JfSURfQkVSS1NISVJFLCBVU0JfREVWSUNFX0lEX0JFUktTSElSRV9QQ1dELCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0NJREMsIDB4MDEwMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWUdOQUwsIFVTQl9ERVZJQ0VfSURfQ1lHTkFMX1JBRElPX1NJNDcwWCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DTUVESUEsIFVTQl9ERVZJQ0VfSURfQ00xMDksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0RFTE9STUUsIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FTV9MVDIwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZLCBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwNCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMzAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzBfNF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzE2XzE2X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzhfOF84X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfOF83X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfOF84X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEX1BISURHRVRfTU9UT1JDT05UUk9MLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dPVE9QLCBVU0JfREVWSUNFX0lEX1NVUEVSX1EyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dPVE9QLCBVU0JfREVWSUNFX0lEX0dPR09QRU4sIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR09UT1AsIFVTQl9ERVZJQ0VfSURfUEVOUE9XRVIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JFVEFHTUFDQkVUSCwgVVNCX0RFVklDRV9JRF9HUkVUQUdNQUNCRVRIX0hVRVksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9QT1dFUk1BVEUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9TT1VOREtOT0IsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzkwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwOCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwNiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA3LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwOSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzUwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDYsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfSU1BVElPTiwgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9LQkdFQVIsIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9DQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9QT0NLRVRDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NT0JJTEVDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9KV00sIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfRE1NUCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9VTUlQLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1ZJREVPQ09NLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfTkVUV09SS0FOQUxZU0VSLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEyMDhMUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUzEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAyMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTA4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTE4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMzAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDA0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1NPVU5ER1JBUEgsIFVTQl9ERVZJQ0VfSURfU09VTkRHUkFQSF9JTU9OX0xDRCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0xDU1BFQywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfWUVBTElOSywgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUCwgVVNCX0RFVklDRV9JRF9QSUNLSVQxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUCwgVVNCX0RFVklDRV9JRF9QSUNLSVQyLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRUxJVEVfS0JELCBISURfUVVJUktfTE9HSVRFQ0hfSUdOT1JFX0RPVUJMRURfV0hFRUwgfCBISURfUVVJUktfTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDAsIEhJRF9RVUlSS19MT0dJVEVDSF9JR05PUkVfRE9VQkxFRF9XSEVFTCB8IEhJRF9RVUlSS19MT0dJVEVDSF9FWFBBTkRFRF9LRVlNQVAgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTFgzLCBISURfUVVJUktfSU5WRVJUX0hXSEVFTCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9WMTUwLCBISURfUVVJUktfSU5WRVJUX0hXSEVFTCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19ORTRLLCBISURfUVVJUktfTUlDUk9TT0ZUX0tFWVMgfSwKLQl7IFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0xLNkssIEhJRF9RVUlSS19NSUNST1NPRlRfS0VZUyB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX01JR0hUWU1PVVNFLCBISURfUVVJUktfTUlHSFRZTU9VU0UgfCBISURfUVVJUktfSU5WRVJUX0hXSEVFTCB9LAotCiAJeyBVU0JfVkVORE9SX0lEX1BBTlRIRVJMT1JELCBVU0JfREVWSUNFX0lEX1BBTlRIRVJMT1JEX1RXSU5fVVNCX0pPWVNUSUNLLCBISURfUVVJUktfTVVMVElfSU5QVVQgfCBISURfUVVJUktfU0tJUF9PVVRQVVRfUkVQT1JUUyB9LAogCXsgVVNCX1ZFTkRPUl9JRF9QTEFZRE9UQ09NLCBVU0JfREVWSUNFX0lEX1BMQVlET1RDT01fRU1TX1VTQklJLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAotCXsgVVNCX1ZFTkRPUl9JRF9TT05ZLCBVU0JfREVWSUNFX0lEX1NPTllfUFMzX0NPTlRST0xMRVIsIEhJRF9RVUlSS19TT05ZX1BTM19DT05UUk9MTEVSIHwgSElEX1FVSVJLX0hJRERFViB9LAotCiAJeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOX0NTMTI0VSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl8yUE9SVEtWTSwgSElEX1FVSVJLX05PR0VUIH0sCkBAIC02MjMsMTQ0ICs1MiwxMyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9BVEVOLCBVU0JfREVWSUNFX0lEX0FURU5fNFBPUlRLVk1DLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfRE1JLCBVU0JfREVWSUNFX0lEX0RNSV9FTkMsIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9FTE8sIFVTQl9ERVZJQ0VfSURfRUxPX1RTMjcwMCwgSElEX1FVSVJLX05PR0VUIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0VYVFJFTUVfM0QsIEhJRF9RVUlSS19OT0dFVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTCwgSElEX1FVSVJLX05PR0VUIH0sCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wLCBISURfUVVJUktfTk9HRVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfUEVUQUxZTlgsIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1NVTiwgVVNCX0RFVklDRV9JRF9SQVJJVEFOX0tWTV9ET05HTEUsIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9UVVJCT1gsIFVTQl9ERVZJQ0VfSURfVFVSQk9YX0tFWUJPQVJELCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX0RVQUxfVVNCX0pPWVBBRCwgSElEX1FVSVJLX05PR0VUIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIHwgSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVFMgfSwKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX1FVQURfVVNCX0pPWVBBRCwgSElEX1FVSVJLX05PR0VUIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQX0xURCwgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0lTTywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9JU08sIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIHwgSElEX1FVSVJLX0FQUExFX0lTT19LRVlCT0FSRH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMsIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfQU5TSSwgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19JU08sIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIHwgSElEX1FVSVJLX0FQUExFX0lTT19LRVlCT0FSRH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTLCBISURfUVVJUktfQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPLCBISURfUVVJUktfQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkR9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0lTTywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkQgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0pJUywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfSVNPLCBISURfUVVJUktfQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0pJUywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0lTTywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkQgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0pJUywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSVNPLCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0FQUExFX0lTT19LRVlCT0FSRCB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0V9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0pJUywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0V9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9BTlNJLCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRX0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0lTTywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkQgfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0pJUywgSElEX1FVSVJLX0FQUExFX0hBU19GTiAgfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSwgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9ERUxMLCBVU0JfREVWSUNFX0lEX0RFTExfVzc2NTgsIEhJRF9RVUlSS19SRVNFVF9MRURTIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0tCRCwgSElEX1FVSVJLX1JFU0VUX0xFRFMgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV85LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzEyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE1LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTYsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yNiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI3LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yOSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zOCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM5LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80MSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ1LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDYsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81NiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU3LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81OSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82MiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTkFUSU9OQUxfU0VNSUNPTkRVQ1RPUiwgVVNCX0RFVklDRV9JRF9OX1NfSEFSTU9OWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX0dQRU5fNTYwLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IDAsIDAgfQotfTsKLQotLyogUXVpcmtzIGZvciBkZXZpY2VzIHdoaWNoIHJlcXVpcmUgcmVwb3J0IGRlc2NyaXB0b3IgZml4dXAgZ28gaGVyZSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfcmRlc2NfYmxhY2tsaXN0IHsKLQlfX3UxNiBpZFZlbmRvcjsKLQlfX3UxNiBpZFByb2R1Y3Q7Ci0JX191MzIgcXVpcmtzOwotfSBoaWRfcmRlc2NfYmxhY2tsaXN0W10gPSB7Ci0KLQl7IFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTiwgSElEX1FVSVJLX1JERVNDX0NZTU9USU9OIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSLCBISURfUVVJUktfUkRFU0NfTE9HSVRFQ0ggfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUiwgSElEX1FVSVJLX1JERVNDX0xPR0lURUNIIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVJfMiwgSElEX1FVSVJLX1JERVNDX0xPR0lURUNIIH0sCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9ERVNLVE9QX1JFQ1ZfMTAyOCwgSElEX1FVSVJLX1JERVNDX01JQ1JPU09GVF9SRUNWXzEwMjggfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9NT05URVJFWSwgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUsIEhJRF9RVUlSS19SREVTQ19CVVRUT05fQ09OU1VNRVIgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUywgSElEX1FVSVJLX1JERVNDX01BQ0JPT0tfSklTIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfUEVUQUxZTlgsIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URSwgSElEX1FVSVJLX1JERVNDX1BFVEFMWU5YIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSwgSElEX1FVSVJLX1JERVNDX1NBTVNVTkdfUkVNT1RFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfU1VOUExVUywgVVNCX0RFVklDRV9JRF9TVU5QTFVTX1dERVNLVE9QLCBISURfUVVJUktfUkRFU0NfU1VOUExVU19XREVTS1RPUCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEsIEhJRF9RVUlSS19SREVTQ19TV0FQUEVEX01JTl9NQVggfSwKLQl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMiwgSElEX1FVSVJLX1JERVNDX1NXQVBQRURfTUlOX01BWCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVBfTFREMiwgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCiAJeyAwLCAwIH0KIH07CkBAIC05NzQsMTYgKzI3Miw2IEBACiAJdTMyIHF1aXJrcyA9IDA7CiAJY29uc3Qgc3RydWN0IGhpZF9ibGFja2xpc3QgKmJsX2VudHJ5ID0gTlVMTDsKIAotCS8qIElnbm9yZSBhbGwgV2Fjb20gZGV2aWNlcyAqLwotCWlmIChpZFZlbmRvciA9PSBVU0JfVkVORE9SX0lEX1dBQ09NKQotCQlyZXR1cm4gSElEX1FVSVJLX0lHTk9SRTsKLQotCS8qIGlnbm9yZSBhbGwgQ29kZSBNZXJjZW5hcmllcyBJT1dhcnJpb3IgZGV2aWNlcyAqLwotCWlmIChpZFZlbmRvciA9PSBVU0JfVkVORE9SX0lEX0NPREVNRVJDUykKLQkJaWYgKGlkUHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfRklSU1QgJiYKLQkJCQlpZFByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0xBU1QpCi0JCQlyZXR1cm4gSElEX1FVSVJLX0lHTk9SRTsKLQogCS8qIE5DUiBkZXZpY2VzIG11c3Qgbm90IGJlIHF1ZXJpZWQgZm9yIHJlcG9ydHMgKi8KIAlpZiAoaWRWZW5kb3IgPT0gVVNCX1ZFTkRPUl9JRF9OQ1IgJiYKIAkJCWlkUHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX05DUl9GSVJTVCAmJgpAQCAtMTAwMiwyMjEgKzI5MCwzIEBACiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYmhpZF9sb29rdXBfcXVpcmspOwotCi0vKgotICogQ2hlcnJ5IEN5bW90aW9uIGtleWJvYXJkIGhhdmUgYW4gaW52YWxpZCBISUQgcmVwb3J0IGRlc2NyaXB0b3IsCi0gKiB0aGF0IG5lZWRzIGZpeGluZyBiZWZvcmUgd2UgY2FuIHBhcnNlIGl0LgotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfY3ltb3Rpb25fZGVzY3JpcHRvcihjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSAxNyAmJiByZGVzY1sxMV0gPT0gMHgzYyAmJiByZGVzY1sxMl0gPT0gMHgwMikgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgQ2hlcnJ5IEN5bW90aW9uIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKLQkJcmRlc2NbMTFdID0gcmRlc2NbMTZdID0gMHhmZjsKLQkJcmRlc2NbMTJdID0gcmRlc2NbMTddID0gMHgwMzsKLQl9Ci19Ci0KLQotLyoKLSAqIENlcnRhaW4gTG9naXRlY2gga2V5Ym9hcmRzIHNlbmQgaW4gcmVwb3J0ICMzIGtleXMgd2hpY2ggYXJlIGZhcgotICogYWJvdmUgdGhlIGxvZ2ljYWwgbWF4aW11bSBkZXNjcmliZWQgaW4gZGVzY3JpcHRvci4gVGhpcyBleHRlbmRzCi0gKiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgMHgyOGMgb2YgbG9naWNhbCBtYXhpbXVtIHRvIDB4MTA0ZAotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfbG9naXRlY2hfZGVzY3JpcHRvcih1bnNpZ25lZCBjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSA5MCAmJiByZGVzY1s4M10gPT0gMHgyNgotCQkJJiYgcmRlc2NbODRdID09IDB4OGMKLQkJCSYmIHJkZXNjWzg1XSA9PSAweDAyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBMb2dpdGVjaCBrZXlib2FyZCByZXBvcnQgZGVzY3JpcHRvclxuIik7Ci0JCXJkZXNjWzg0XSA9IHJkZXNjWzg5XSA9IDB4NGQ7Ci0JCXJkZXNjWzg1XSA9IHJkZXNjWzkwXSA9IDB4MTA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfc3VucGx1c193ZGVza3RvcCh1bnNpZ25lZCBjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSAxMDcgJiYgcmRlc2NbMTA0XSA9PSAweDI2Ci0JCQkgJiYgcmRlc2NbMTA1XSA9PSAweDgwCi0JCQkgJiYgcmRlc2NbMTA2XSA9PSAweDAzKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBTdW5wbHVzIFdpcmVsZXNzIERlc2t0b3AgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwotCQlyZGVzY1sxMDVdID0gcmRlc2NbMTEwXSA9IDB4MDM7Ci0JCXJkZXNjWzEwNl0gPSByZGVzY1sxMTFdID0gMHgyMTsKLQl9Ci19Ci0KLS8qCi0gKiBTYW1zdW5nIElyREEgcmVtb3RlIGNvbnRyb2xsZXIgKHJlcG9ydHMgYXMgQ3lwcmVzcyBVU0IgTW91c2UpLgotICoKLSAqIFZlbmRvciBzcGVjaWZpYyByZXBvcnQgIzQgaGFzIGEgc2l6ZSBvZiA0OCBiaXQsCi0gKiBhbmQgdGhlcmVmb3JlIGlzIG5vdCBhY2NlcHRlZCB3aGVuIGluc3BlY3RpbmcgdGhlIGRlc2NyaXB0b3JzLgotICogQXMgYSB3b3JrYXJvdW5kIHdlIHJlaW50ZXJwcmV0IHRoZSByZXBvcnQgYXM6Ci0gKiAgIFZhcmlhYmxlIHR5cGUsIGNvdW50IDYsIHNpemUgOCBiaXQsIGxvZy4gbWF4aW11bSAyNTUKLSAqIFRoZSBidXJkZW4gdG8gcmVjb25zdHJ1Y3QgdGhlIGRhdGEgaXMgbW92ZWQgaW50byB1c2VyIHNwYWNlLgotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfc2Ftc3VuZ19pcmRhX2Rlc2NyaXB0b3IodW5zaWduZWQgY2hhciAqcmRlc2MsCi0JCQkJCQkgIGludCByc2l6ZSkKLXsKLQlpZiAocnNpemUgPj0gMTgyICYmIHJkZXNjWzE3NV0gPT0gMHgyNQotCQkJICYmIHJkZXNjWzE3Nl0gPT0gMHg0MAotCQkJICYmIHJkZXNjWzE3N10gPT0gMHg3NQotCQkJICYmIHJkZXNjWzE3OF0gPT0gMHgzMAotCQkJICYmIHJkZXNjWzE3OV0gPT0gMHg5NQotCQkJICYmIHJkZXNjWzE4MF0gPT0gMHgwMQotCQkJICYmIHJkZXNjWzE4Ml0gPT0gMHg0MCkgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgU2Ftc3VuZyBJckRBIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKLQkJcmRlc2NbMTc2XSA9IDB4ZmY7Ci0JCXJkZXNjWzE3OF0gPSAweDA4OwotCQlyZGVzY1sxODBdID0gMHgwNjsKLQkJcmRlc2NbMTgyXSA9IDB4NDI7Ci0JfQotfQotCi0vKiBQZXRhbHlueCBNYXh0ZXIgUmVtb3RlIGhhcyBtYXhpbXVtIGZvciBjb25zdW1lciBwYWdlIHNldCB0b28gbG93ICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfcGV0YWx5bnhfZGVzY3JpcHRvcih1bnNpZ25lZCBjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSA2MCAmJiByZGVzY1szOV0gPT0gMHgyYQotCQkJJiYgcmRlc2NbNDBdID09IDB4ZjUKLQkJCSYmIHJkZXNjWzQxXSA9PSAweDAwCi0JCQkmJiByZGVzY1s1OV0gPT0gMHgyNgotCQkJJiYgcmRlc2NbNjBdID09IDB4ZjkKLQkJCSYmIHJkZXNjWzYxXSA9PSAweDAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBQZXRhbHlueCBNYXh0ZXIgUmVtb3RlIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKLQkJcmRlc2NbNjBdID0gMHhmYTsKLQkJcmRlc2NbNDBdID0gMHhmYTsKLQl9Ci19Ci0KLS8qCi0gKiBTb21lIFVTQiBiYXJjb2RlIHJlYWRlcnMgZnJvbSBjeXByZXNzIGhhdmUgdXNhZ2UgbWluIGFuZCB1c2FnZSBtYXggaW4KLSAqIHRoZSB3cm9uZyBvcmRlcgotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfY3lwcmVzc19kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0Jc2hvcnQgZml4ZWQgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJzaXplIC0gNDsgaSsrKSB7Ci0JCWlmIChyZGVzY1tpXSA9PSAweDI5ICYmIHJkZXNjIFtpKzJdID09IDB4MTkpIHsKLQkJCXVuc2lnbmVkIGNoYXIgdG1wOwotCi0JCQlyZGVzY1tpXSA9IDB4MTk7IHJkZXNjW2krMl0gPSAweDI5OwotCQkJdG1wID0gcmRlc2NbaSszXTsKLQkJCXJkZXNjW2krM10gPSByZGVzY1tpKzFdOwotCQkJcmRlc2NbaSsxXSA9IHRtcDsKLQkJfQotCX0KLQotCWlmIChmaXhlZCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRml4aW5nIHVwIEN5cHJlc3MgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwotfQotCi0vKgotICogTWFjQm9vayBKSVMga2V5Ym9hcmQgaGFzIHdyb25nIGxvZ2ljYWwgbWF4aW11bQotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfbWFjYm9va19kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0JaWYgKHJzaXplID49IDYwICYmIHJkZXNjWzUzXSA9PSAweDY1Ci0JCQkmJiByZGVzY1s1OV0gPT0gMHg2NSkgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgTWFjQm9vayBKSVMga2V5Ym9hcmQgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwotCQlyZGVzY1s1M10gPSByZGVzY1s1OV0gPSAweGU3OwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXNiaGlkX2ZpeHVwX2J1dHRvbl9jb25zdW1lcl9kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0JaWYgKHJzaXplID49IDMwICYmIHJkZXNjWzI5XSA9PSAweDA1Ci0JCQkmJiByZGVzY1szMF0gPT0gMHgwOSkgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgYnV0dG9uL2NvbnN1bWVyIGluIEhJRCByZXBvcnQgZGVzY3JpcHRvclxuIik7Ci0JCXJkZXNjWzMwXSA9IDB4MGM7Ci0JfQotfQotCi0vKgotICogTWljcm9zb2Z0IFdpcmVsZXNzIERlc2t0b3AgUmVjZWl2ZXIgKE1vZGVsIDEwMjgpIGhhcyBzZXZlcmFsCi0gKiAnVXNhZ2UgTWluL01heCcgd2hlcmUgaXQgb3VnaHQgdG8gaGF2ZSAnUGh5c2ljYWwgTWluL01heCcKLSAqLwotc3RhdGljIHZvaWQgdXNiaGlkX2ZpeHVwX21pY3Jvc29mdF9kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0JaWYgKHJzaXplID09IDU3MSAmJiByZGVzY1syODRdID09IDB4MTkKLQkgICAgICAgICAgICAgICAgICYmIHJkZXNjWzI4Nl0gPT0gMHgyYQotCSAgICAgICAgICAgICAgICAgJiYgcmRlc2NbMzA0XSA9PSAweDE5Ci0JICAgICAgICAgICAgICAgICAmJiByZGVzY1szMDZdID09IDB4MjkKLQkgICAgICAgICAgICAgICAgICYmIHJkZXNjWzM1Ml0gPT0gMHgxYQotCSAgICAgICAgICAgICAgICAgJiYgcmRlc2NbMzU1XSA9PSAweDJhCi0JCQkgJiYgcmRlc2NbNTU3XSA9PSAweDE5Ci0JCQkgJiYgcmRlc2NbNTU5XSA9PSAweDI5KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBNaWNyb3NvZnQgV2lyZWxlc3MgUmVjZWl2ZXIgTW9kZWwgMTAyOCByZXBvcnQgZGVzY3JpcHRvclxuIik7Ci0JCXJkZXNjWzI4NF0gPSByZGVzY1szMDRdID0gcmRlc2NbNTU3XSA9IDB4MzU7Ci0JCXJkZXNjWzM1Ml0gPSAweDM2OwotCQlyZGVzY1syODZdID0gcmRlc2NbMzU1XSA9IDB4NDY7Ci0JCXJkZXNjWzMwNl0gPSByZGVzY1s1NTldID0gMHg0NTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fdXNiaGlkX2ZpeHVwX3JlcG9ydF9kZXNjcmlwdG9yKF9fdTMyIHF1aXJrcywgY2hhciAqcmRlc2MsIHVuc2lnbmVkIHJzaXplKQotewotCWlmICgocXVpcmtzICYgSElEX1FVSVJLX1JERVNDX0NZTU9USU9OKSkKLQkJdXNiaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfTE9HSVRFQ0gpCi0JCXVzYmhpZF9maXh1cF9sb2dpdGVjaF9kZXNjcmlwdG9yKHJkZXNjLCByc2l6ZSk7Ci0KLQlpZiAocXVpcmtzICYgSElEX1FVSVJLX1JERVNDX1NXQVBQRURfTUlOX01BWCkKLQkJdXNiaGlkX2ZpeHVwX2N5cHJlc3NfZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOwotCi0JaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19SREVTQ19QRVRBTFlOWCkKLQkJdXNiaGlkX2ZpeHVwX3BldGFseW54X2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfTUFDQk9PS19KSVMpCi0JCXVzYmhpZF9maXh1cF9tYWNib29rX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfQlVUVE9OX0NPTlNVTUVSKQotCQl1c2JoaWRfZml4dXBfYnV0dG9uX2NvbnN1bWVyX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfU0FNU1VOR19SRU1PVEUpCi0JCXVzYmhpZF9maXh1cF9zYW1zdW5nX2lyZGFfZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOwotCi0JaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19SREVTQ19NSUNST1NPRlRfUkVDVl8xMDI4KQotCQl1c2JoaWRfZml4dXBfbWljcm9zb2Z0X2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfU1VOUExVU19XREVTS1RPUCkKLQkJdXNiaGlkX2ZpeHVwX3N1bnBsdXNfd2Rlc2t0b3AocmRlc2MsIHJzaXplKTsKLX0KLQotLyoqCi0gKiB1c2JoaWRfZml4dXBfcmVwb3J0X2Rlc2NyaXB0b3I6IGNoZWNrIGlmIHJlcG9ydCBkZXNjcmlwdG9yIG5lZWRzIGZpeHVwCi0gKgotICogRGVzY3JpcHRpb246Ci0gKglXYWxrcyB0aGUgaGlkX3JkZXNjX2JsYWNrbGlzdFtdIGFycmF5IGFuZCBjaGVja3Mgd2hldGhlciB0aGUgZGV2aWNlCi0gKglpcyBrbm93biB0byBoYXZlIGJyb2tlbiByZXBvcnQgZGVzY3JpcHRvciB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIHVwCi0gKglwcmlvciB0byBlbnRlcmluZyB0aGUgSElEIHBhcnNlcgotICoKLSAqIFJldHVybnM6IG5vdGhpbmcKLSAqLwotdm9pZCB1c2JoaWRfZml4dXBfcmVwb3J0X2Rlc2NyaXB0b3IoY29uc3QgdTE2IGlkVmVuZG9yLCBjb25zdCB1MTYgaWRQcm9kdWN0LAotCQkJCSAgICBjaGFyICpyZGVzYywgdW5zaWduZWQgcnNpemUsIGNoYXIgKipxdWlya3NfcGFyYW0pCi17Ci0JaW50IG4sIG07Ci0JdTE2IHBhcmFtVmVuZG9yLCBwYXJhbVByb2R1Y3Q7Ci0JdTMyIHF1aXJrczsKLQotCS8qIHN0YXRpYyByZGVzYyBxdWlyayBlbnRyaWVzICovCi0JZm9yIChuID0gMDsgaGlkX3JkZXNjX2JsYWNrbGlzdFtuXS5pZFZlbmRvcjsgbisrKQotCQlpZiAoaGlkX3JkZXNjX2JsYWNrbGlzdFtuXS5pZFZlbmRvciA9PSBpZFZlbmRvciAmJgotCQkJCWhpZF9yZGVzY19ibGFja2xpc3Rbbl0uaWRQcm9kdWN0ID09IGlkUHJvZHVjdCkKLQkJCV9fdXNiaGlkX2ZpeHVwX3JlcG9ydF9kZXNjcmlwdG9yKGhpZF9yZGVzY19ibGFja2xpc3Rbbl0ucXVpcmtzLAotCQkJCQlyZGVzYywgcnNpemUpOwotCi0JLyogcnVudGltZSByZGVzYyBxdWlyayBlbnRyaWVzIGhhbmRsaW5nICovCi0JZm9yIChuID0gMDsgcXVpcmtzX3BhcmFtW25dICYmIG4gPCBNQVhfVVNCSElEX0JPT1RfUVVJUktTOyBuKyspIHsKLQkJbSA9IHNzY2FuZihxdWlya3NfcGFyYW1bbl0sICIweCVoeDoweCVoeDoweCV4IiwKLQkJCQkmcGFyYW1WZW5kb3IsICZwYXJhbVByb2R1Y3QsICZxdWlya3MpOwotCi0JCWlmIChtICE9IDMpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJIkNvdWxkIG5vdCBwYXJzZSBISUQgcXVpcmsgbW9kdWxlIHBhcmFtICVzXG4iLAotCQkJCXF1aXJrc19wYXJhbVtuXSk7Ci0JCWVsc2UgaWYgKHBhcmFtVmVuZG9yID09IGlkVmVuZG9yICYmIHBhcmFtUHJvZHVjdCA9PSBpZFByb2R1Y3QpCi0JCQlfX3VzYmhpZF9maXh1cF9yZXBvcnRfZGVzY3JpcHRvcihxdWlya3MsIHJkZXNjLCByc2l6ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCmluZGV4IDg0MmU5ZWQuLmJhYmQ2NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKQEAgLTc5MCwyMSArNzkwLDIzIEBACiAvKgogICogVGhpcyBpcyB3aGVyZSBoaWQuYyBjYWxscyB1cyB0byBjb25uZWN0IGEgaGlkIGRldmljZSB0byB0aGUgaGlkZGV2IGRyaXZlcgogICovCi1pbnQgaGlkZGV2X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK2ludCBoaWRkZXZfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCB1bnNpZ25lZCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IGhpZGRldiAqaGlkZGV2OwogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwotCWludCBpOwogCWludCByZXR2YWw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspCi0JCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PQotCQkgICAgSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gJiYKLQkJICAgICFJU19JTlBVVF9BUFBMSUNBVElPTihoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UpKQotCQkJYnJlYWs7CisJaWYgKCFmb3JjZSkgeworCQl1bnNpZ25lZCBpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKQorCQkJaWYgKGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09CisJCQkgICAgSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gJiYKKwkJCSAgICAhSVNfSU5QVVRfQVBQTElDQVRJT04oaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlKSkKKwkJCQlicmVhazsKIAotCWlmIChpID09IGhpZC0+bWF4Y29sbGVjdGlvbiAmJiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfSElEREVWKSA9PSAwKQotCQlyZXR1cm4gLTE7CisJCWlmIChpID09IGhpZC0+bWF4Y29sbGVjdGlvbikKKwkJCXJldHVybiAtMTsKKwl9CiAKIAlpZiAoIShoaWRkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkZGV2KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmggYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmgKaW5kZXggNjJkMmQ3Yy4uYWJlZGIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaApAQCAtNjcsNyArNjcsNyBAQAogCXNwaW5sb2NrX3QgY3RybGxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIGZpZm8gc3BpbmxvY2sgKi8KIAogCXN0cnVjdCB1cmIgKnVyYm91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgVVJCICovCi0Jc3RydWN0IGhpZF9yZXBvcnQgKm91dFtISURfQ09OVFJPTF9GSUZPX1NJWkVdOyAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBwaXBlIGZpZm8gKi8KKwlzdHJ1Y3QgaGlkX291dHB1dF9maWZvIG91dFtISURfQ09OVFJPTF9GSUZPX1NJWkVdOyAgICAgICAgICAgICAgLyogT3V0cHV0IHBpcGUgZmlmbyAqLwogCXVuc2lnbmVkIGNoYXIgb3V0aGVhZCwgb3V0dGFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgcGlwZSBmaWZvIGhlYWQgJiB0YWlsICovCiAJY2hhciAqb3V0YnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KIAlkbWFfYWRkcl90IG91dGJ1Zl9kbWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciBkbWEgKi8KQEAgLTgyLDcgKzgyLDcgQEAKIH07CiAKICNkZWZpbmUJaGlkX3RvX3VzYl9kZXYoaGlkX2RldikgXAotCWNvbnRhaW5lcl9vZihoaWRfZGV2LT5kZXYtPnBhcmVudCwgc3RydWN0IHVzYl9kZXZpY2UsIGRldikKKwljb250YWluZXJfb2YoaGlkX2Rldi0+ZGV2LnBhcmVudC0+cGFyZW50LCBzdHJ1Y3QgdXNiX2RldmljZSwgZGV2KQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCmluZGV4IDBjYWFhZmUuLmIzNDI5MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKQEAgLTEwNSwxNCArMTA1LDE2IEBACiAJCQlpZiAodXNiX2tiZF9rZXljb2RlW2tiZC0+b2xkW2ldXSkKIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGtiZC0+ZGV2LCB1c2Jfa2JkX2tleWNvZGVba2JkLT5vbGRbaV1dLCAwKTsKIAkJCWVsc2UKLQkJCQlpbmZvKCJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC4iLCBrYmQtPm9sZFtpXSk7CisJCQkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsCisJCQkJCQkiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcmVsZWFzZWQuXG4iLCBrYmQtPm9sZFtpXSk7CiAJCX0KIAogCQlpZiAoa2JkLT5uZXdbaV0gPiAzICYmIG1lbXNjYW4oa2JkLT5vbGQgKyAyLCBrYmQtPm5ld1tpXSwgNikgPT0ga2JkLT5vbGQgKyA4KSB7CiAJCQlpZiAodXNiX2tiZF9rZXljb2RlW2tiZC0+bmV3W2ldXSkKIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGtiZC0+ZGV2LCB1c2Jfa2JkX2tleWNvZGVba2JkLT5uZXdbaV1dLCAxKTsKIAkJCWVsc2UKLQkJCQlpbmZvKCJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSBwcmVzc2VkLiIsIGtiZC0+bmV3W2ldKTsKKwkJCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCQkJCSJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC5cbiIsIGtiZC0+bmV3W2ldKTsKIAkJfQogCX0KIApAQCAtMTU5LDcgKzE2MSw4IEBACiAJc3RydWN0IHVzYl9rYmQgKmtiZCA9IHVyYi0+Y29udGV4dDsKIAogCWlmICh1cmItPnN0YXR1cykKLQkJd2FybigibGVkIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWQiLCB1cmItPnN0YXR1cyk7CisJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAibGVkIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsCisJCQkgdXJiLT5zdGF0dXMpOwogCiAJaWYgKCooa2JkLT5sZWRzKSA9PSBrYmQtPm5ld2xlZHMpCiAJCXJldHVybjsKQEAgLTM1Miw3ICszNTUsOCBAQAogewogCWludCByZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJnVzYl9rYmRfZHJpdmVyKTsKIAlpZiAocmVzdWx0ID09IDApCi0JCWluZm8oRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgorCQkJCURSSVZFUl9ERVNDICJcbiIpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2Jtb3VzZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYm1vdXNlLmMKaW5kZXggMzU2ODllZi4uNzJhYjRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYm1vdXNlLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYm1vdXNlLmMKQEAgLTMxLDYgKzMxLDExIEBACiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAKKy8qIGZvciBhcHBsZSBJRHMgKi8KKyNpZmRlZiBDT05GSUdfVVNCX0hJRF9NT0RVTEUKKyNpbmNsdWRlICIuLi9oaWQtaWRzLmgiCisjZW5kaWYKKwogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwpAQCAtMjQwLDcgKzI0NSw4IEBACiB7CiAJaW50IHJldHZhbCA9IHVzYl9yZWdpc3RlcigmdXNiX21vdXNlX2RyaXZlcik7CiAJaWYgKHJldHZhbCA9PSAwKQotCQlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CisJCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBEUklWRVJfVkVSU0lPTiAiOiIKKwkJCQlEUklWRVJfREVTQyAiXG4iKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IGNkYjgzMTEuLjI3YTVkMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC0xNzUsMTEgKzE3NSwxMSBAQAogICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCBtYW5pcHVsYXRpb24gdGhlcmVvZgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIEZvciBJU0EgY2hpcHMsIHdlIGFidXNlIHRoZSBpMmNfY2xpZW50IGFkZHIgYW5kIG5hbWUgZmllbGRzLiBXZSBhbHNvIHVzZQotICAgdGhlIGRyaXZlciBmaWVsZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gSTJDIGFuZCBJU0EgY2hpcHMuICovCiBzdHJ1Y3QgZG1lMTczN19kYXRhIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsJLyogZm9yIEkyQyBkZXZpY2VzIG9ubHkgKi8KIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgYWRkcjsJCS8qIGZvciBJU0EgZGV2aWNlcyBvbmx5ICovCiAKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJaW50IHZhbGlkOwkJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwpAQCAtNTEyLDExICs1MTIsMTIgQEAKICAqIGJlZm9yZSBjYWxsaW5nIGRtZTE3MzdfcmVhZCBvciBkbWUxNzM3X3dyaXRlLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB1OCBkbWUxNzM3X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQorc3RhdGljIHU4IGRtZTE3MzdfcmVhZChjb25zdCBzdHJ1Y3QgZG1lMTczN19kYXRhICpkYXRhLCB1OCByZWcpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlzMzIgdmFsOwogCi0JaWYgKGNsaWVudC0+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+ZGV2KTsKLQlyZWxlYXNlX3JlZ2lvbihkYXRhLT5jbGllbnQuYWRkciwgRE1FMTczN19FWFRFTlQpOworCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmFkZHIsIERNRTE3MzdfRVhURU5UKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlrZnJlZShkYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwppbmRleCA2ZWU5OTdiLi5hY2FkYmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwpAQCAtNTUsNyArNTUsNyBAQAogCiBjb25maWcgSTJDX0FNRDc1Nl9TNDg4MgogCXRyaXN0YXRlICJTTUJ1cyBtdWx0aXBsZXhpbmcgb24gdGhlIFR5YW4gUzQ4ODIiCi0JZGVwZW5kcyBvbiBJMkNfQU1ENzU2ICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gSTJDX0FNRDc1NiAmJiBYODYgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBhZGQgc3BlY2lmaWMgU01CdXMgc3VwcG9ydCBmb3IgdGhlIFR5YW4KIAkgIFM0ODgyIG1vdGhlcmJvYXJkLiAgT24gdGhpcyA0LUNQVSBib2FyZCwgdGhlIFNNQnVzIGlzIG11bHRpcGxleGVkCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogY29uZmlnIEkyQ19ORk9SQ0UyX1M0OTg1CiAJdHJpc3RhdGUgIlNNQnVzIG11bHRpcGxleGluZyBvbiB0aGUgVHlhbiBTNDk4NSIKLQlkZXBlbmRzIG9uIEkyQ19ORk9SQ0UyICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gSTJDX05GT1JDRTIgJiYgWDg2ICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgYWRkIHNwZWNpZmljIFNNQnVzIHN1cHBvcnQgZm9yIHRoZSBUeWFuCiAJICBTNDk4NSBtb3RoZXJib2FyZC4gIE9uIHRoaXMgNC1DUFUgYm9hcmQsIHRoZSBTTUJ1cyBpcyBtdWx0aXBsZXhlZApAQCAtMjA5LDcgKzIwOSw3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtdmlhLgogCiBjb25maWcgSTJDX1ZJQVBSTwotCXRyaXN0YXRlICJWSUEgVlQ4MkM1OTYvODJDNjg2LzgyeHggYW5kIENYNzAwIgorCXRyaXN0YXRlICJWSUEgVlQ4MkM1OTYvODJDNjg2LzgyeHggYW5kIENYNzAwL1ZYODAwL1ZYODIwIgogCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIFZJQQpAQCAtMjIzLDYgKzIyMyw4IEBACiAJICAgIFZUODIzN1IvQS9TCiAJICAgIFZUODI1MQogCSAgICBDWDcwMAorCSAgICBWWDgwMAorCSAgICBWWDgyMAogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtdmlhcHJvLgpAQCAtMzMwLDYgKzMzMiwxOCBAQAogCSAgVGhpcyBpcyBhIHZlcnkgc2ltcGxlIGJpdGJhbmdpbmcgSTJDIGRyaXZlciB1dGlsaXppbmcgdGhlCiAJICBhcmNoLW5ldXRyYWwgR1BJTyBBUEkgdG8gY29udHJvbCB0aGUgU0NMIGFuZCBTREEgbGluZXMuCiAKK2NvbmZpZyBJMkNfSElHSExBTkRFUgorCXRyaXN0YXRlICJIaWdobGFuZGVyIEZQR0EgU01CdXMgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gU0hfSElHSExBTkRFUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yCisJICB0aGUgU01CdXMgaW50ZXJmYWNlIGxvY2F0ZWQgaW4gdGhlIEZQR0Egb24gdmFyaW91cyBIaWdobGFuZGVyCisJICBib2FyZHMsIHBhcnRpY3VsYXJseSB0aGUgUjBQNzc4MExDMDAxMVJMIGFuZCBSMFA3Nzg1TEMwMDExUkwKKwkgIEZQR0FzLiBUaGlzIGlzIHdob2xseSB1bnJlbGF0ZWQgdG8gdGhlIFNvQyBJMkMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1oaWdobGFuZGVyLgorCiBjb25maWcgSTJDX0lCTV9JSUMKIAl0cmlzdGF0ZSAiSUJNIFBQQyA0eHggb24tY2hpcCBJMkMgaW50ZXJmYWNlIgogCWRlcGVuZHMgb24gNHh4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKaW5kZXggOTdkYmZhMi4uMGMyYzRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogb2JqLSQoQ09ORklHX0kyQ19DUE0pCQkrPSBpMmMtY3BtLm8KIG9iai0kKENPTkZJR19JMkNfREFWSU5DSSkJKz0gaTJjLWRhdmluY2kubwogb2JqLSQoQ09ORklHX0kyQ19HUElPKQkJKz0gaTJjLWdwaW8ubworb2JqLSQoQ09ORklHX0kyQ19ISUdITEFOREVSKQkrPSBpMmMtaGlnaGxhbmRlci5vCiBvYmotJChDT05GSUdfSTJDX0lCTV9JSUMpCSs9IGkyYy1pYm1faWljLm8KIG9iai0kKENPTkZJR19JMkNfSU9QM1hYKQkrPSBpMmMtaW9wM3h4Lm8KIG9iai0kKENPTkZJR19JMkNfSVhQMjAwMCkJKz0gaTJjLWl4cDIwMDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oaWdobGFuZGVyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQyMmFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oaWdobGFuZGVyLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBSZW5lc2FzIFNvbHV0aW9ucyBIaWdobGFuZGVyIEZQR0EgSTJDL1NNQnVzIHN1cHBvcnQuCisgKgorICogU3VwcG9ydGVkIGRldmljZXM6IFIwUDc3ODBMQzAwMTFSTCwgUjBQNzc4NUxDMDAxMVJMCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3RvcnkKKyAqIG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+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+YmFzZSk7CisJa2ZyZWUoZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhpZ2hsYW5kZXJfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiaTJjLWhpZ2hsYW5kZXIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCisJLnByb2JlCQk9IGhpZ2hsYW5kZXJfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaGlnaGxhbmRlcl9pMmNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhpZ2hsYW5kZXJfaTJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoaWdobGFuZGVyX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaGlnaGxhbmRlcl9pMmNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoaWdobGFuZGVyX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChoaWdobGFuZGVyX2kyY19pbml0KTsKK21vZHVsZV9leGl0KGhpZ2hsYW5kZXJfaTJjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlbmVzYXMgSGlnaGxhbmRlciBGUEdBIEkyQy9TTUJ1cyBhZGFwdGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9wYXJhbShpaWNfZm9yY2VfcG9sbCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaWljX2ZvcmNlX25vcm1hbCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaWljX3RpbWVvdXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaWljX3JlYWRfZGVsYXksIGludCwgMCk7CisKK01PRFVMRV9QQVJNX0RFU0MoaWljX2ZvcmNlX3BvbGwsICJGb3JjZSBwb2xsaW5nIG1vZGUiKTsKK01PRFVMRV9QQVJNX0RFU0MoaWljX2ZvcmNlX25vcm1hbCwKKwkJICJGb3JjZSBub3JtYWwgbW9kZSAoMTAwIGtIeiksIGRlZmF1bHQgaXMgZmFzdCBtb2RlICg0MDAga0h6KSIpOworTU9EVUxFX1BBUk1fREVTQyhpaWNfdGltZW91dCwgIlNldCB0aW1lb3V0IHZhbHVlIGluIG1zZWNzIChkZWZhdWx0IDEwMDAgbXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlpY19yZWFkX2RlbGF5LAorCQkgIkRlbGF5IGJldHdlZW4gZGF0YSByZWFkIGN5Y2xlcyAoZGVmYXVsdCAwIG1zKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LWxpZ2h0LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQtbGlnaHQuYwppbmRleCBjNmZhZjliLi5iMmI4MzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQtbGlnaHQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQtbGlnaHQuYwpAQCAtMTIzLDExICsxMjMsNiBAQAogc3RhdGljIGludCBfX2RldmluaXQgaTJjX3BhcnBvcnRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwotCWlmICghcmVxdWVzdF9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSwgRFJWTkFNRSkpCi0JCXJldHVybiAtRUJVU1k7CiAKIAkvKiBSZXNldCBoYXJkd2FyZSB0byBhIHNhbmUgc3RhdGUgKFNDTCBhbmQgU0RBIGhpZ2gpICovCiAJcGFycG9ydF9zZXRzZGEoTlVMTCwgMSk7CkBAIC0xMzgsMjkgKzEzMywxOSBAQAogCiAJcGFycG9ydF9hZGFwdGVyLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCWVyciA9IGkyY19iaXRfYWRkX2J1cygmcGFycG9ydF9hZGFwdGVyKTsKLQlpZiAoZXJyKSB7CisJaWYgKGVycikKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggSTJDXG4iKTsKLQkJZ290byBleGl0X3JlZ2lvbjsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWV4aXRfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGkyY19wYXJwb3J0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCiAJaTJjX2RlbF9hZGFwdGVyKCZwYXJwb3J0X2FkYXB0ZXIpOwogCiAJLyogVW4taW5pdCBpZiBuZWVkZWQgKHBvd2VyIG9mZi4uLikgKi8KIAlpZiAoYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQudmFsKQogCQlsaW5lX3NldCgwLCAmYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQpOwogCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwotCXJlbGVhc2VfcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzUsMTIgKzE2MCw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGkyY19wYXJwb3J0X2RldmljZV9hZGQodTE2IGFkZHJlc3MpCiB7Ci0Jc3RydWN0IHJlc291cmNlIHJlcyA9IHsKLQkJLnN0YXJ0CT0gYWRkcmVzcywKLQkJLmVuZAk9IGFkZHJlc3MgKyAyLAotCQkubmFtZQk9IERSVk5BTUUsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCi0JfTsKIAlpbnQgZXJyOwogCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCAtMSk7CkBAIC0xOTAsMTMgKzE2OSw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7Ci0JCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwotCX0KLQogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCkBAIC0yMzEsMTMgKzIwMywxNiBAQAogCQliYXNlID0gREVGQVVMVF9CQVNFOwogCX0KIAorCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgMywgRFJWTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKICAgICAgICAgaWYgKCFhZGFwdGVyX3Bhcm1bdHlwZV0uZ2V0c2NsLnZhbCkKIAkJcGFycG9ydF9hbGdvX2RhdGEuZ2V0c2NsID0gTlVMTDsKIAogCS8qIFNldHMgZ2xvYmFsIHBkZXYgYXMgYSBzaWRlIGVmZmVjdCAqLwogCWVyciA9IGkyY19wYXJwb3J0X2RldmljZV9hZGQoYmFzZSk7CiAJaWYgKGVycikKLQkJZ290byBleGl0OworCQlnb3RvIGV4aXRfcmVsZWFzZTsKIAogCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaTJjX3BhcnBvcnRfZHJpdmVyKTsKIAlpZiAoZXJyKQpAQCAtMjQ3LDcgKzIyMiw4IEBACiAKIGV4aXRfZGV2aWNlOgogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwotZXhpdDoKK2V4aXRfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihiYXNlLCAzKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNTUsNiArMjMxLDcgQEAKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaTJjX3BhcnBvcnRfZHJpdmVyKTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihiYXNlLCAzKTsKIH0KIAogTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBjYS1pc2EuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGNhLWlzYS5jCmluZGV4IGExMTk3ODQuLmY4MGRmOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGNhLWlzYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGNhLWlzYS5jCkBAIC0zNiw4ICszNiw4IEBACiAjZGVmaW5lIERSSVZFUiAiaTJjLXBjYS1pc2EiCiAjZGVmaW5lIElPX1NJWkUgNAogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiYXNlICAgPSAweDMzMDsKLXN0YXRpYyBpbnQgaXJxIAkgID0gMTA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBiYXNlOworc3RhdGljIGludCBpcnEgPSAtMTsKIAogLyogRGF0YSBzaGVldCByZWNvbW1lbmRzIDU5a0h6IGZvciAxMDBrSHogb3BlcmF0aW9uIGR1ZSB0byB2YXJpYXRpb24KICAqIGluIHRoZSBhY3R1YWwgY2xvY2sgcmF0ZSAqLwpAQCAtMTA3LDYgKzEwNywxOSBAQAogCS50aW1lb3V0CT0gMTAwLAogfTsKIAorc3RhdGljIGludCBfX2RldmluaXQgcGNhX2lzYV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlpbnQgbWF0Y2ggPSBiYXNlICE9IDA7CisKKwlpZiAobWF0Y2gpIHsKKwkJaWYgKGlycSA8PSAtMSkKKwkJCWRldl93YXJuKGRldiwgIlVzaW5nIHBvbGxpbmcgbW9kZSAoc3BlY2lmeSBpcnEpXG4iKTsKKwl9IGVsc2UKKwkJZGV2X2VycihkZXYsICJQbGVhc2Ugc3BlY2lmeSBJL08gYmFzZVxuIik7CisKKwlyZXR1cm4gbWF0Y2g7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjYV9pc2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNhX3dhaXQpOwpAQCAtMTUzLDcgKzE2Niw3IEBACiB7CiAJaTJjX2RlbF9hZGFwdGVyKCZwY2FfaXNhX29wcyk7CiAKLQlpZiAoaXJxID4gMCkgeworCWlmIChpcnEgPiAtMSkgewogCQlkaXNhYmxlX2lycShpcnEpOwogCQlmcmVlX2lycShpcnEsICZwY2FfaXNhX29wcyk7CiAJfQpAQCAtMTYzLDYgKzE3Niw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBwY2FfaXNhX2RyaXZlciA9IHsKKwkubWF0Y2gJCT0gcGNhX2lzYV9tYXRjaCwKIAkucHJvYmUJCT0gcGNhX2lzYV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBjYV9pc2FfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKaW5kZXggODYyZWIzNS4uNzNkYzUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYXByby5jCkBAIC0zNiw2ICszNiw3IEBACiAgICBWVDgyMzdTICAgICAgICAgICAgMHgzMzcyICAgICAgICAgICAgIHllcwogICAgVlQ4MjUxICAgICAgICAgICAgIDB4MzI4NyAgICAgICAgICAgICB5ZXMKICAgIENYNzAwICAgICAgICAgICAgICAweDgzMjQgICAgICAgICAgICAgeWVzCisgICBWWDgwMC9WWDgyMCAgICAgICAgMHg4MzUzICAgICAgICAgICAgIHllcwogCiAgICBOb3RlOiB3ZSBhc3N1bWUgdGhlcmUgY2FuIG9ubHkgYmUgb25lIGRldmljZSwgd2l0aCBvbmUgU01CdXMgaW50ZXJmYWNlLgogKi8KQEAgLTgyLDYgKzgzLDcgQEAKICNkZWZpbmUgVlQ1OTZfQllURQkJMHgwNAogI2RlZmluZSBWVDU5Nl9CWVRFX0RBVEEJCTB4MDgKICNkZWZpbmUgVlQ1OTZfV09SRF9EQVRBCQkweDBDCisjZGVmaW5lIFZUNTk2X1BST0NfQ0FMTAkJMHgxMAogI2RlZmluZSBWVDU5Nl9CTE9DS19EQVRBCTB4MTQKICNkZWZpbmUgVlQ1OTZfSTJDX0JMT0NLX0RBVEEJMHgzNAogCkBAIC0yMzIsNiArMjM0LDEyIEBACiAJCX0KIAkJc2l6ZSA9IFZUNTk2X1dPUkRfREFUQTsKIAkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJb3V0Yl9wKGRhdGEtPndvcmQgJiAweGZmLCBTTUJIU1REQVQwKTsKKwkJb3V0Yl9wKChkYXRhLT53b3JkICYgMHhmZjAwKSA+PiA4LCBTTUJIU1REQVQxKTsKKwkJc2l6ZSA9IFZUNTk2X1BST0NfQ0FMTDsKKwkJYnJlYWs7CiAJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6CiAJCWlmICghKHZ0NTk2X2ZlYXR1cmVzICYgRkVBVFVSRV9JMkNCTE9DSykpCiAJCQlnb3RvIGV4aXRfdW5zdXBwb3J0ZWQ7CkBAIC0yNjIsNiArMjcwLDkgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCisJaWYgKHNpemUgPT0gVlQ1OTZfUFJPQ19DQUxMKQorCQlyZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7CisKIAlpZiAoKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBWVDU5Nl9RVUlDSykpCiAJCXJldHVybiAwOwogCkBAIC0yNzEsNiArMjgyLDcgQEAKIAkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQkhTVERBVDApOwogCQlicmVhazsKIAljYXNlIFZUNTk2X1dPUkRfREFUQToKKwljYXNlIFZUNTk2X1BST0NfQ0FMTDoKIAkJZGF0YS0+d29yZCA9IGluYl9wKFNNQkhTVERBVDApICsgKGluYl9wKFNNQkhTVERBVDEpIDw8IDgpOwogCQlicmVhazsKIAljYXNlIFZUNTk2X0kyQ19CTE9DS19EQVRBOgpAQCAtMjk1LDcgKzMwNyw3IEBACiB7CiAJdTMyIGZ1bmMgPSBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAogCSAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAotCSAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOworCSAgICBJMkNfU01CVVNfUFJPQ19DQUxMIHwgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQTsKIAogCWlmICh2dDU5Nl9mZWF0dXJlcyAmIEZFQVRVUkVfSTJDQkxPQ0spCiAJCWZ1bmMgfD0gSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLOwpAQCAtMzk2LDYgKzQwOCw3IEBACiAKIAlzd2l0Y2ggKHBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9WSUFfQ1g3MDA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV9WWDgwMDoKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyNTE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjM3OgogCWNhc2UgUENJX0RFVklDRV9JRF9WSUFfODIzN0E6CkBAIC00NTksNiArNDcyLDggQEAKIAkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfQ1g3MDApLAogCSAgLmRyaXZlcl9kYXRhID0gU01CQkEzIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV9WWDgwMCksCisJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKIAl7IDAsIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKaW5kZXggNDY1NWI3OS4uMjg5MDJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKQEAgLTQ5LDEwICs0OSw5IEBACiAKIHN0cnVjdCBpc3AxMzAxIHsKIAlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyCW90ZzsKLQlzdHJ1Y3QgaTJjX2NsaWVudAljbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKIAl2b2lkCQkJKCppMmNfcmVsZWFzZSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAotCWludAkJCWlycTsKIAlpbnQJCQlpcnFfdHlwZTsKIAogCXUzMgkJCWxhc3Rfb3RnX2N0cmw7CkBAIC0xMzgsMTQgKzEzNyw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIG9ubHkgdHdvIGFkZHJlc3NlcyBwb3NzaWJsZSAqLwotI2RlZmluZQlJU1BfQkFTRQkJMHgyYwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQlJU1BfQkFTRSwgSVNQX0JBU0UgKyAxLAotCUkyQ19DTElFTlRfRU5EIH07Ci0KLUkyQ19DTElFTlRfSU5TTU9EOwotCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXI7CiAKIC8qIHNtYnVzIGFwaXMgYXJlIHVzZWQgZm9yIHBvcnRhYmlsaXR5ICovCkBAIC0xNTMsMjUgKzE0NCwyNSBAQAogc3RhdGljIGlubGluZSB1OAogaXNwMTMwMV9nZXRfdTgoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggcmVnKQogewotCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJmlzcC0+Y2xpZW50LCByZWcgKyAwKTsKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGlzcC0+Y2xpZW50LCByZWcgKyAwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKIGlzcDEzMDFfZ2V0X3UxNihzdHJ1Y3QgaXNwMTMwMSAqaXNwLCB1OCByZWcpCiB7Ci0JcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSgmaXNwLT5jbGllbnQsIHJlZyk7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShpc3AtPmNsaWVudCwgcmVnKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKIGlzcDEzMDFfc2V0X2JpdHMoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggcmVnLCB1OCBiaXRzKQogewotCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZpc3AtPmNsaWVudCwgcmVnICsgMCwgYml0cyk7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoaXNwLT5jbGllbnQsIHJlZyArIDAsIGJpdHMpOwogfQogCiBzdGF0aWMgaW5saW5lIGludAogaXNwMTMwMV9jbGVhcl9iaXRzKHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IHJlZywgdTggYml0cykKIHsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgmaXNwLT5jbGllbnQsIHJlZyArIDEsIGJpdHMpOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGlzcC0+Y2xpZW50LCByZWcgKyAxLCBiaXRzKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM0OSwxMCArMzQwLDEwIEBACiAJaW50IHN0YXR1czsKIAogCWlmIChpc3AgJiYgIXRlc3RfYW5kX3NldF9iaXQod29yaywgJmlzcC0+dG9kbykpIHsKLQkJKHZvaWQpIGdldF9kZXZpY2UoJmlzcC0+Y2xpZW50LmRldik7CisJCSh2b2lkKSBnZXRfZGV2aWNlKCZpc3AtPmNsaWVudC0+ZGV2KTsKIAkJc3RhdHVzID0gc2NoZWR1bGVfd29yaygmaXNwLT53b3JrKTsKIAkJaWYgKCFzdGF0dXMgJiYgIWlzcC0+d29ya2luZykKLQkJCWRldl92ZGJnKCZpc3AtPmNsaWVudC5kZXYsCisJCQlkZXZfdmRiZygmaXNwLT5jbGllbnQtPmRldiwKIAkJCQkid29yayBpdGVtICVkIG1heSBiZSBsb3N0XG4iLCB3b3JrKTsKIAl9CiB9CkBAIC0xMTM1LDcgKzExMjYsNyBAQAogCQkvKiB0cmFuc2ZlciBzdGF0ZSBmcm9tIG90ZyBlbmdpbmUgdG8gaXNwMTMwMSAqLwogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdPUktfVVBEQVRFX0lTUCwgJmlzcC0+dG9kbykpIHsKIAkJCW90Z191cGRhdGVfaXNwKGlzcCk7Ci0JCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQtPmRldik7CiAJCX0KICNlbmRpZgogCQkvKiB0cmFuc2ZlciBzdGF0ZSBmcm9tIGlzcDEzMDEgdG8gb3RnIGVuZ2luZSAqLwpAQCAtMTE0Myw3ICsxMTM0LDcgQEAKIAkJCXU4CQlzdGF0ID0gaXNwMTMwMV9jbGVhcl9sYXRjaChpc3ApOwogCiAJCQlpc3BfdXBkYXRlX290Zyhpc3AsIHN0YXQpOwotCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQuZGV2KTsKKwkJCXB1dF9kZXZpY2UoJmlzcC0+Y2xpZW50LT5kZXYpOwogCQl9CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX0hPU1RfUkVTVU1FLCAmaXNwLT50b2RvKSkgewpAQCAtMTE3OCw3ICsxMTY5LDcgQEAKIAkJCX0KIAkJCWhvc3RfcmVzdW1lKGlzcCk7CiAJCQkvLyBtZGVsYXkoMTApOwotCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQuZGV2KTsKKwkJCXB1dF9kZXZpY2UoJmlzcC0+Y2xpZW50LT5kZXYpOwogCQl9CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX1RJTUVSLCAmaXNwLT50b2RvKSkgewpAQCAtMTE4NywxNSArMTE3OCwxNSBAQAogCQkJaWYgKCFzdG9wKQogCQkJCW1vZF90aW1lcigmaXNwLT50aW1lciwgamlmZmllcyArIFRJTUVSX0pJRkZJRVMpOwogI2VuZGlmCi0JCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQtPmRldik7CiAJCX0KIAogCQlpZiAoaXNwLT50b2RvKQotCQkJZGV2X3ZkYmcoJmlzcC0+Y2xpZW50LmRldiwKKwkJCWRldl92ZGJnKCZpc3AtPmNsaWVudC0+ZGV2LAogCQkJCSJ3b3JrIGRvbmUsIHRvZG8gPSAweCVseFxuIiwKIAkJCQlpc3AtPnRvZG8pOwogCQlpZiAoc3RvcCkgewotCQkJZGV2X2RiZygmaXNwLT5jbGllbnQuZGV2LCAic3RvcFxuIik7CisJCQlkZXZfZGJnKCZpc3AtPmNsaWVudC0+ZGV2LCAic3RvcFxuIik7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGlzcC0+dG9kbyk7CkBAIC0xMjE5LDcgKzEyMTAsNyBAQAogewogCXN0cnVjdCBpc3AxMzAxCSppc3A7CiAKLQlpc3AgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaXNwMTMwMSwgY2xpZW50LmRldik7CisJaXNwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAkvKiB1Z2x5IC0tIGkyYyBoaWphY2tzIG91ciBtZW1vcnkgaG9vayB0byB3YWl0X2Zvcl9jb21wbGV0aW9uKCkgKi8KIAlpZiAoaXNwLT5pMmNfcmVsZWFzZSkKQEAgLTEyMjksMTUgKzEyMjAsMTUgQEAKIAogc3RhdGljIHN0cnVjdCBpc3AxMzAxICp0aGVfdHJhbnNjZWl2ZXI7CiAKLXN0YXRpYyBpbnQgaXNwMTMwMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCitzdGF0aWMgaW50IF9fZXhpdCBpc3AxMzAxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQogewogCXN0cnVjdCBpc3AxMzAxCSppc3A7CiAKLQlpc3AgPSBjb250YWluZXJfb2YoaTJjLCBzdHJ1Y3QgaXNwMTMwMSwgY2xpZW50KTsKKwlpc3AgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKIAogCWlzcDEzMDFfY2xlYXJfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0ZBTExJTkcsIH4wKTsKIAlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9SSVNJTkcsIH4wKTsKLQlmcmVlX2lycShpc3AtPmlycSwgaXNwKTsKKwlmcmVlX2lycShpMmMtPmlycSwgaXNwKTsKICNpZmRlZglDT05GSUdfVVNCX09URwogCW90Z191bmJpbmQoaXNwKTsKICNlbmRpZgpAQCAtMTI1Miw3ICsxMjQzLDcgQEAKIAlwdXRfZGV2aWNlKCZpMmMtPmRldik7CiAJdGhlX3RyYW5zY2VpdmVyID0gMDsKIAotCXJldHVybiBpMmNfZGV0YWNoX2NsaWVudChpMmMpOworCXJldHVybiAwOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTI4NSw3ICsxMjc2LDcgQEAKIAlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfRkFMTElORywKIAkJSU5UUl9WQlVTX1ZMRCB8IElOVFJfU0VTU19WTEQgfCBJTlRSX0lEX0dORCk7CiAKLQlkZXZfaW5mbygmaXNwLT5jbGllbnQuZGV2LCAicmVhZHkgZm9yIGR1YWwtcm9sZSBVU0IgLi4uXG4iKTsKKwlkZXZfaW5mbygmaXNwLT5jbGllbnQtPmRldiwgInJlYWR5IGZvciBkdWFsLXJvbGUgVVNCIC4uLlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMTAsNyArMTMwMSw3IEBACiAKICNpZmRlZglDT05GSUdfVVNCX09URwogCWlzcC0+b3RnLmhvc3QgPSBob3N0OwotCWRldl9kYmcoJmlzcC0+Y2xpZW50LmRldiwgInJlZ2lzdGVyZWQgaG9zdFxuIik7CisJZGV2X2RiZygmaXNwLT5jbGllbnQtPmRldiwgInJlZ2lzdGVyZWQgaG9zdFxuIik7CiAJaG9zdF9zdXNwZW5kKGlzcCk7CiAJaWYgKGlzcC0+b3RnLmdhZGdldCkKIAkJcmV0dXJuIGlzcDEzMDFfb3RnX2VuYWJsZShpc3ApOwpAQCAtMTMyNSw3ICsxMzE2LDcgQEAKIAlpZiAobWFjaGluZV9pc19vbWFwX2gyKCkpCiAJCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX01PREVfQ09OVFJPTF8xLCBNQzFfREFUX1NFMCk7CiAKLQlkZXZfaW5mbygmaXNwLT5jbGllbnQuZGV2LCAiQS1Ib3N0IHNlc3Npb25zIG9rXG4iKTsKKwlkZXZfaW5mbygmaXNwLT5jbGllbnQtPmRldiwgIkEtSG9zdCBzZXNzaW9ucyBva1xuIik7CiAJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX1JJU0lORywKIAkJSU5UUl9JRF9HTkQpOwogCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HLApAQCAtMTM0Myw3ICsxMzM0LDcgQEAKIAlyZXR1cm4gMDsKIAogI2Vsc2UKLQlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJob3N0IHNlc3Npb25zIG5vdCBhbGxvd2VkXG4iKTsKKwlkZXZfZGJnKCZpc3AtPmNsaWVudC0+ZGV2LCAiaG9zdCBzZXNzaW9ucyBub3QgYWxsb3dlZFxuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIApAQCAtMTM3MCw3ICsxMzYxLDcgQEAKIAogI2lmZGVmCUNPTkZJR19VU0JfT1RHCiAJaXNwLT5vdGcuZ2FkZ2V0ID0gZ2FkZ2V0OwotCWRldl9kYmcoJmlzcC0+Y2xpZW50LmRldiwgInJlZ2lzdGVyZWQgZ2FkZ2V0XG4iKTsKKwlkZXZfZGJnKCZpc3AtPmNsaWVudC0+ZGV2LCAicmVnaXN0ZXJlZCBnYWRnZXRcbiIpOwogCS8qIGdhZGdldCBkcml2ZXIgbWF5IGJlIHN1c3BlbmRlZCB1bnRpbCB2YnVzX2Nvbm5lY3QgKCkgKi8KIAlpZiAoaXNwLT5vdGcuaG9zdCkKIAkJcmV0dXJuIGlzcDEzMDFfb3RnX2VuYWJsZShpc3ApOwpAQCAtMTM5NSw3ICsxMzg2LDcgQEAKIAkJSU5UUl9TRVNTX1ZMRCk7CiAJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0ZBTExJTkcsCiAJCUlOVFJfVkJVU19WTEQpOwotCWRldl9pbmZvKCZpc3AtPmNsaWVudC5kZXYsICJCLVBlcmlwaGVyYWwgc2Vzc2lvbnMgb2tcbiIpOworCWRldl9pbmZvKCZpc3AtPmNsaWVudC0+ZGV2LCAiQi1QZXJpcGhlcmFsIHNlc3Npb25zIG9rXG4iKTsKIAlkdW1wX3JlZ3MoaXNwLCBfX2Z1bmNfXyk7CiAKIAkvKiBJZiB0aGlzIGhhcyBhIE1pbmktQUIgY29ubmVjdG9yLCB0aGlzIG1vZGUgaXMgaGlnaGx5CkBAIC0xNDA4LDcgKzEzOTksNyBAQAogCXJldHVybiAwOwogCiAjZWxzZQotCWRldl9kYmcoJmlzcC0+Y2xpZW50LmRldiwgInBlcmlwaGVyYWwgc2Vzc2lvbnMgbm90IGFsbG93ZWRcbiIpOworCWRldl9kYmcoJmlzcC0+Y2xpZW50LT5kZXYsICJwZXJpcGhlcmFsIHNlc3Npb25zIG5vdCBhbGxvd2VkXG4iKTsKIAlyZXR1cm4gLUVJTlZBTDsKICNlbmRpZgogfQpAQCAtMTUwOCwxMiArMTQ5OSwxMCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBubyBlcnJvciByZXR1cm5zLCB0aGV5J2QganVzdCBtYWtlIGJ1cyBzY2FubmluZyBzdG9wICovCi1zdGF0aWMgaW50IGlzcDEzMDFfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICpidXMsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgX19pbml0IGlzcDEzMDFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKIHsKIAlpbnQJCQlzdGF0dXM7CiAJc3RydWN0IGlzcDEzMDEJCSppc3A7Ci0Jc3RydWN0IGkyY19jbGllbnQJKmkyYzsKIAogCWlmICh0aGVfdHJhbnNjZWl2ZXIpCiAJCXJldHVybiAwOwpAQCAtMTUyNywzNyArMTUxNiwxOSBAQAogCWlzcC0+dGltZXIuZnVuY3Rpb24gPSBpc3AxMzAxX3RpbWVyOwogCWlzcC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBpc3A7CiAKLQlpc3AtPmlycSA9IC0xOwotCWlzcC0+Y2xpZW50LmFkZHIgPSBhZGRyZXNzOwotCWkyY19zZXRfY2xpZW50ZGF0YSgmaXNwLT5jbGllbnQsIGlzcCk7Ci0JaXNwLT5jbGllbnQuYWRhcHRlciA9IGJ1czsKLQlpc3AtPmNsaWVudC5kcml2ZXIgPSAmaXNwMTMwMV9kcml2ZXI7Ci0Jc3RybGNweShpc3AtPmNsaWVudC5uYW1lLCBEUklWRVJfTkFNRSwgSTJDX05BTUVfU0laRSk7Ci0JaTJjID0gJmlzcC0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGlzcCk7CisJaXNwLT5jbGllbnQgPSBpMmM7CiAKLQkvKiBpZiB0aGlzIGlzIGEgdHJ1ZSBwcm9iZSwgdmVyaWZ5IHRoZSBjaGlwIC4uLiAqLwotCWlmIChraW5kIDwgMCkgewotCQlzdGF0dXMgPSBpc3AxMzAxX2dldF91MTYoaXNwLCBJU1AxMzAxX1ZFTkRPUl9JRCk7Ci0JCWlmIChzdGF0dXMgIT0gSTJDX1ZFTkRPUl9JRF9QSElMSVBTKSB7Ci0JCQlkZXZfZGJnKCZidXMtPmRldiwgImFkZHIgJWQgbm90IHBoaWxpcHMgaWQ6ICVkXG4iLAotCQkJCWFkZHJlc3MsIHN0YXR1cyk7Ci0JCQlnb3RvIGZhaWwxOwotCQl9Ci0JCXN0YXR1cyA9IGlzcDEzMDFfZ2V0X3UxNihpc3AsIElTUDEzMDFfUFJPRFVDVF9JRCk7Ci0JCWlmIChzdGF0dXMgIT0gSTJDX1BST0RVQ1RfSURfUEhJTElQU18xMzAxKSB7Ci0JCQlkZXZfZGJnKCZidXMtPmRldiwgIiVkIG5vdCBpc3AxMzAxLCAlZFxuIiwKLQkJCQlhZGRyZXNzLCBzdGF0dXMpOwotCQkJZ290byBmYWlsMTsKLQkJfQorCS8qIHZlcmlmeSB0aGUgY2hpcCAoc2hvdWxkbid0IGJlIG5lY2VzYXJ5KSAqLworCXN0YXR1cyA9IGlzcDEzMDFfZ2V0X3UxNihpc3AsIElTUDEzMDFfVkVORE9SX0lEKTsKKwlpZiAoc3RhdHVzICE9IEkyQ19WRU5ET1JfSURfUEhJTElQUykgeworCQlkZXZfZGJnKCZpMmMtPmRldiwgIm5vdCBwaGlsaXBzIGlkOiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBmYWlsOwogCX0KLQotCXN0YXR1cyA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2RiZygmYnVzLT5kZXYsICJjYW4ndCBhdHRhY2ggJXMgdG8gZGV2aWNlICVkLCBlcnIgJWRcbiIsCi0JCQkJRFJJVkVSX05BTUUsIGFkZHJlc3MsIHN0YXR1cyk7Ci1mYWlsMToKLQkJa2ZyZWUoaXNwKTsKLQkJcmV0dXJuIDA7CisJc3RhdHVzID0gaXNwMTMwMV9nZXRfdTE2KGlzcCwgSVNQMTMwMV9QUk9EVUNUX0lEKTsKKwlpZiAoc3RhdHVzICE9IEkyQ19QUk9EVUNUX0lEX1BISUxJUFNfMTMwMSkgeworCQlkZXZfZGJnKCZpMmMtPmRldiwgIm5vdCBpc3AxMzAxLCAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBmYWlsOwogCX0KIAlpc3AtPmkyY19yZWxlYXNlID0gaTJjLT5kZXYucmVsZWFzZTsKIAlpMmMtPmRldi5yZWxlYXNlID0gaXNwMTMwMV9yZWxlYXNlOwpAQCAtMTU4Niw3ICsxNTU3LDcgQEAKIAlzdGF0dXMgPSBvdGdfYmluZChpc3ApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRldl9kYmcoJmkyYy0+ZGV2LCAiY2FuJ3QgYmluZCBPVEdcbiIpOwotCQlnb3RvIGZhaWwyOworCQlnb3RvIGZhaWw7CiAJfQogI2VuZGlmCiAKQEAgLTE1OTksMjYgKzE1NzAsMjEgQEAKIAogCQkvKiBJUlEgd2lyZWQgYXQgTTE0ICovCiAJCW9tYXBfY2ZnX3JlZyhNMTRfMTUxMF9HUElPMik7Ci0JCWlzcC0+aXJxID0gT01BUF9HUElPX0lSUSgyKTsKIAkJaWYgKGdwaW9fcmVxdWVzdCgyLCAiaXNwMTMwMSIpID09IDApCiAJCQlncGlvX2RpcmVjdGlvbl9pbnB1dCgyKTsKIAkJaXNwLT5pcnFfdHlwZSA9IElSUUZfVFJJR0dFUl9GQUxMSU5HOwogCX0KIAogCWlzcC0+aXJxX3R5cGUgfD0gSVJRRl9TQU1QTEVfUkFORE9NOwotCXN0YXR1cyA9IHJlcXVlc3RfaXJxKGlzcC0+aXJxLCBpc3AxMzAxX2lycSwKKwlzdGF0dXMgPSByZXF1ZXN0X2lycShpMmMtPmlycSwgaXNwMTMwMV9pcnEsCiAJCQlpc3AtPmlycV90eXBlLCBEUklWRVJfTkFNRSwgaXNwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZGJnKCZpMmMtPmRldiwgImNhbid0IGdldCBJUlEgJWQsIGVyciAlZFxuIiwKLQkJCQlpc3AtPmlycSwgc3RhdHVzKTsKLSNpZmRlZglDT05GSUdfVVNCX09URwotZmFpbDI6Ci0jZW5kaWYKLQkJaTJjX2RldGFjaF9jbGllbnQoaTJjKTsKLQkJZ290byBmYWlsMTsKKwkJCQlpMmMtPmlycSwgc3RhdHVzKTsKKwkJZ290byBmYWlsOwogCX0KIAotCWlzcC0+b3RnLmRldiA9ICZpc3AtPmNsaWVudC5kZXY7CisJaXNwLT5vdGcuZGV2ID0gJmkyYy0+ZGV2OwogCWlzcC0+b3RnLmxhYmVsID0gRFJJVkVSX05BTUU7CiAKIAlpc3AtPm90Zy5zZXRfaG9zdCA9IGlzcDEzMDFfc2V0X2hvc3QsCkBAIC0xNjQ5LDIyICsxNjE1LDI1IEBACiAJCQlzdGF0dXMpOwogCiAJcmV0dXJuIDA7CisKK2ZhaWw6CisJa2ZyZWUoaXNwKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCBpc3AxMzAxX3NjYW5fYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYnVzKQotewotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYnVzLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEKLQkJCXwgSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gaTJjX3Byb2JlKGJ1cywgJmFkZHJfZGF0YSwgaXNwMTMwMV9wcm9iZSk7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXNwMTMwMV9pZFtdID0geworCXsgImlzcDEzMDFfb21hcCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgaXNwMTMwMV9pZCk7CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpc3AxMzAxX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJpc3AxMzAxX29tYXAiLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyCT0gaXNwMTMwMV9zY2FuX2J1cywKLQkuZGV0YWNoX2NsaWVudAk9IGlzcDEzMDFfZGV0YWNoX2NsaWVudCwKKwkucHJvYmUJCT0gaXNwMTMwMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGlzcDEzMDFfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBpc3AxMzAxX2lkLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCmluZGV4IGNmMDJlOGYuLmFjZjhiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwpAQCAtNDU2LDE0ICs0NTYsMTcgQEAKIAogLyogb2Zmc2V0cyAwLi4zID09IEdQSU8xLi5HUElPNAogICogb2Zmc2V0cyA0Li41ID09IExFRDEvblBHLCBMRUQyICh3ZSBzZXQgb25lIG9mIHRoZSBub24tQkxJTksgbW9kZXMpCisgKiBvZmZzZXQgNiA9PSB2aWJyYXRvciBtb3RvciBkcml2ZXIKICAqLwogc3RhdGljIHZvaWQKIHRwczY1MDEwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQogewogCWlmIChvZmZzZXQgPCA0KQogCQl0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUob2Zmc2V0ICsgMSwgdmFsdWUpOwotCWVsc2UKKwllbHNlIGlmIChvZmZzZXQgPCA2KQogCQl0cHM2NTAxMF9zZXRfbGVkKG9mZnNldCAtIDMsIHZhbHVlID8gT04gOiBPRkYpOworCWVsc2UKKwkJdHBzNjUwMTBfc2V0X3ZpYih2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ3Nyw4ICs0ODAsMTAgQEAKIAkJaWYgKCEodHBzLT5vdXRtYXNrICYgKDEgPDwgb2Zmc2V0KSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKG9mZnNldCArIDEsIHZhbHVlKTsKLQl9IGVsc2UKKwl9IGVsc2UgaWYgKG9mZnNldCA8IDYpCiAJCXRwczY1MDEwX3NldF9sZWQob2Zmc2V0IC0gMywgdmFsdWUgPyBPTiA6IE9GRik7CisJZWxzZQorCQl0cHM2NTAxMF9zZXRfdmliKHZhbHVlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQ2LDcgKzY1MSw3IEBACiAJCXRwcy0+Y2hpcC5nZXQgPSB0cHM2NTAxMF9ncGlvX2dldDsKIAogCQl0cHMtPmNoaXAuYmFzZSA9IGJvYXJkLT5iYXNlOwotCQl0cHMtPmNoaXAubmdwaW8gPSA2OworCQl0cHMtPmNoaXAubmdwaW8gPSA3OwogCQl0cHMtPmNoaXAuY2FuX3NsZWVwID0gMTsKIAogCQlzdGF0dXMgPSBncGlvY2hpcF9hZGQoJnRwcy0+Y2hpcCk7CkBAIC02NzUsNiArNjgwLDcgQEAKIAl7ICJ0cHM2NTAxMSIsIFRQUzY1MDExIH0sCiAJeyAidHBzNjUwMTIiLCBUUFM2NTAxMiB9LAogCXsgInRwczY1MDEzIiwgVFBTNjUwMTMgfSwKKwl7ICJ0cHM2NTAxNCIsIFRQUzY1MDExIH0sCS8qIHRwczY1MDExIGNoYXJnaW5nIGF0IDYuNVYgbWF4ICovCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRwczY1MDEwX2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCmluZGV4IGIzNDZhNjguLjQyZTg1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwpAQCAtNDM3LDYgKzQzNywxMCBAQAogewogCWludCByZXMgPSAwLCBkdW1teTsKIAorCS8qIENhbid0IHJlZ2lzdGVyIHVudGlsIGFmdGVyIGRyaXZlciBtb2RlbCBpbml0ICovCisJaWYgKHVubGlrZWx5KFdBUk5fT04oIWkyY19idXNfdHlwZS5wKSkpCisJCXJldHVybiAtRUFHQUlOOworCiAJbXV0ZXhfaW5pdCgmYWRhcC0+YnVzX2xvY2spOwogCW11dGV4X2luaXQoJmFkYXAtPmNsaXN0X2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZhZGFwLT5jbGllbnRzKTsKQEAgLTY5Niw2ICs3MDAsMTAgQEAKIHsKIAlpbnQgcmVzOwogCisJLyogQ2FuJ3QgcmVnaXN0ZXIgdW50aWwgYWZ0ZXIgZHJpdmVyIG1vZGVsIGluaXQgKi8KKwlpZiAodW5saWtlbHkoV0FSTl9PTighaTJjX2J1c190eXBlLnApKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKIAkvKiBuZXcgc3R5bGUgZHJpdmVyIG1ldGhvZHMgY2FuJ3QgbWl4IHdpdGggbGVnYWN5IG9uZXMgKi8KIAlpZiAoaXNfbmV3c3R5bGVfZHJpdmVyKGRyaXZlcikpIHsKIAkJaWYgKGRyaXZlci0+YXR0YWNoX2FkYXB0ZXIgfHwgZHJpdmVyLT5kZXRhY2hfYWRhcHRlcgpAQCAtOTc4LDcgKzk4NiwxMCBAQAogCWJ1c191bnJlZ2lzdGVyKCZpMmNfYnVzX3R5cGUpOwogfQogCi1zdWJzeXNfaW5pdGNhbGwoaTJjX2luaXQpOworLyogV2UgbXVzdCBpbml0aWFsaXplIGVhcmx5LCBiZWNhdXNlIHNvbWUgc3Vic3lzdGVtcyByZWdpc3RlciBpMmMgZHJpdmVycworICogaW4gc3Vic3lzX2luaXRjYWxsKCkgY29kZSwgYnV0IGFyZSBsaW5rZWQgKGFuZCBpbml0aWFsaXplZCkgYmVmb3JlIGkyYy4KKyAqLworcG9zdGNvcmVfaW5pdGNhbGwoaTJjX2luaXQpOwogbW9kdWxlX2V4aXQoaTJjX2V4aXQpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNjc3LDYgKzE2ODgsMjggQEAKIEVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YSk7CiAKIC8qKgorICogaTJjX3NtYnVzX3Byb2Nlc3NfY2FsbCAtIFNNQnVzICJwcm9jZXNzIGNhbGwiIHByb3RvY29sCisgKiBAY2xpZW50OiBIYW5kbGUgdG8gc2xhdmUgZGV2aWNlCisgKiBAY29tbWFuZDogQnl0ZSBpbnRlcnByZXRlZCBieSBzbGF2ZQorICogQHZhbHVlOiAxNi1iaXQgIndvcmQiIGJlaW5nIHdyaXR0ZW4KKyAqCisgKiBUaGlzIGV4ZWN1dGVzIHRoZSBTTUJ1cyAicHJvY2VzcyBjYWxsIiBwcm90b2NvbCwgcmV0dXJuaW5nIG5lZ2F0aXZlIGVycm5vCisgKiBlbHNlIGEgMTYtYml0IHVuc2lnbmVkICJ3b3JkIiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCisgKi8KK3MzMiBpMmNfc21idXNfcHJvY2Vzc19jYWxsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSkKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCWludCBzdGF0dXM7CisJZGF0YS53b3JkID0gdmFsdWU7CisKKwlzdGF0dXMgPSBpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsIGNsaWVudC0+YWRkciwgY2xpZW50LT5mbGFncywKKwkJCQlJMkNfU01CVVNfV1JJVEUsIGNvbW1hbmQsCisJCQkJSTJDX1NNQlVTX1BST0NfQ0FMTCwgJmRhdGEpOworCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiBkYXRhLndvcmQ7Cit9CitFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c19wcm9jZXNzX2NhbGwpOworCisvKioKICAqIGkyY19zbWJ1c19yZWFkX2Jsb2NrX2RhdGEgLSBTTUJ1cyAiYmxvY2sgcmVhZCIgcHJvdG9jb2wKICAqIEBjbGllbnQ6IEhhbmRsZSB0byBzbGF2ZSBkZXZpY2UKICAqIEBjb21tYW5kOiBCeXRlIGludGVycHJldGVkIGJ5IHNsYXZlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2hwX3NkY19ydGMuYwppbmRleCBkYWE5ZDQyLi44MmVjNmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMKQEAgLTQ1OCwzNSArNDU4LDM1IEBACiAJCXAgKz0gc3ByaW50ZihwLCAiaTgwNDIgcnRjXHQ6IFJFQUQgRkFJTEVEIVxuIik7CiAJfSBlbHNlIHsKIAkJcCArPSBzcHJpbnRmKHAsICJpODA0MiBydGNcdDogJWxkLiUwMmQgc2Vjb25kc1xuIiwgCi0JCQkgICAgIHR2LnR2X3NlYywgdHYudHZfdXNlYy8xMDAwKTsKKwkJCSAgICAgdHYudHZfc2VjLCAoaW50KXR2LnR2X3VzZWMvMTAwMCk7CiAJfQogCiAJaWYgKGhwX3NkY19ydGNfcmVhZF9maHMoJnR2KSkgewogCQlwICs9IHNwcmludGYocCwgImhhbmRzaGFrZVx0OiBSRUFEIEZBSUxFRCFcbiIpOwogCX0gZWxzZSB7CiAgICAgICAgIAlwICs9IHNwcmludGYocCwgImhhbmRzaGFrZVx0OiAlbGQuJTAyZCBzZWNvbmRzXG4iLCAKLQkJCSAgICAgdHYudHZfc2VjLCB0di50dl91c2VjLzEwMDApOworCQkJICAgICB0di50dl9zZWMsIChpbnQpdHYudHZfdXNlYy8xMDAwKTsKIAl9CiAKIAlpZiAoaHBfc2RjX3J0Y19yZWFkX210KCZ0dikpIHsKIAkJcCArPSBzcHJpbnRmKHAsICJhbGFybVx0XHQ6IFJFQUQgRkFJTEVEIVxuIik7CiAJfSBlbHNlIHsKIAkJcCArPSBzcHJpbnRmKHAsICJhbGFybVx0XHQ6ICVsZC4lMDJkIHNlY29uZHNcbiIsIAotCQkJICAgICB0di50dl9zZWMsIHR2LnR2X3VzZWMvMTAwMCk7CisJCQkgICAgIHR2LnR2X3NlYywgKGludCl0di50dl91c2VjLzEwMDApOwogCX0KIAogCWlmIChocF9zZGNfcnRjX3JlYWRfZHQoJnR2KSkgewogCQlwICs9IHNwcmludGYocCwgImRlbGF5XHRcdDogUkVBRCBGQUlMRUQhXG4iKTsKIAl9IGVsc2UgewogCQlwICs9IHNwcmludGYocCwgImRlbGF5XHRcdDogJWxkLiUwMmQgc2Vjb25kc1xuIiwgCi0JCQkgICAgIHR2LnR2X3NlYywgdHYudHZfdXNlYy8xMDAwKTsKKwkJCSAgICAgdHYudHZfc2VjLCAoaW50KXR2LnR2X3VzZWMvMTAwMCk7CiAJfQogCiAJaWYgKGhwX3NkY19ydGNfcmVhZF9jdCgmdHYpKSB7CiAJCXAgKz0gc3ByaW50ZihwLCAicGVyaW9kaWNcdDogUkVBRCBGQUlMRUQhXG4iKTsKIAl9IGVsc2UgewogCQlwICs9IHNwcmludGYocCwgInBlcmlvZGljXHQ6ICVsZC4lMDJkIHNlY29uZHNcbiIsIAotCQkJICAgICB0di50dl9zZWMsIHR2LnR2X3VzZWMvMTAwMCk7CisJCQkgICAgIHR2LnR2X3NlYywgKGludCl0di50dl91c2VjLzEwMDApOwogCX0KIAogICAgICAgICBwICs9IHNwcmludGYocCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hwX3NkYy5jCmluZGV4IDBkMzk1OTcuLmJmZTQ5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9ocF9zZGMuYwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJCQkgKiBpdCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbi4gYW5kIGJlIGxlc3MgdmVyYm9zZS4KIAkJCSAqLwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggInJlYWQgdGltZW91dCAoJWl1cykhXG4iLAotCQkJICAgICAgIHR2LnR2X3VzZWMgLSBocF9zZGMucnR2LnR2X3VzZWMpOworCQkJICAgICAgIChpbnQpKHR2LnR2X3VzZWMgLSBocF9zZGMucnR2LnR2X3VzZWMpKTsKIAkJCWN1cnItPmlkeCArPSBocF9zZGMucnF0eTsKIAkJCWhwX3NkYy5ycXR5ID0gMDsKIAkJCXRtcCA9IGN1cnItPnNlcVtjdXJyLT5hY3RpZHhdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY214LmMKaW5kZXggZTkyYjFiYS4uYzJmNTFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2NteC5jCkBAIC00NTIsMTAgKzQ1MiwxMCBAQAogCQkJaWYgKGZpbmRkc3AtPmZlYXR1cmVzLnBjbV9pZCA9PSBkc3AtPmZlYXR1cmVzLnBjbV9pZCkgewogCQkJCWlmIChmaW5kZHNwLT5wY21fc2xvdF9yeCA+PSAwICYmCiAJCQkJICAgIGZpbmRkc3AtPnBjbV9zbG90X3J4IDwgc2l6ZW9mKGZyZWVzbG90cykpCi0JCQkJCWZyZWVzbG90c1tmaW5kZHNwLT5wY21fc2xvdF90eF0gPSAwOworCQkJCQlmcmVlc2xvdHNbZmluZGRzcC0+cGNtX3Nsb3RfcnhdID0gMDsKIAkJCQlpZiAoZmluZGRzcC0+cGNtX3Nsb3RfdHggPj0gMCAmJgogCQkJCSAgICBmaW5kZHNwLT5wY21fc2xvdF90eCA8IHNpemVvZihmcmVlc2xvdHMpKQotCQkJCQlmcmVlc2xvdHNbZmluZGRzcC0+cGNtX3Nsb3RfcnhdID0gMDsKKwkJCQkJZnJlZXNsb3RzW2ZpbmRkc3AtPnBjbV9zbG90X3R4XSA9IDA7CiAJCQl9CiAJCX0KIAkJaSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vdGltZXJkZXYuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi90aW1lcmRldi5jCmluZGV4IGU3NDYyOTIuLjg3NWZhYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi90aW1lcmRldi5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi90aW1lcmRldi5jCkBAIC02MSw3ICs2MSw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53YWl0KTsKIAlmaWxlcC0+cHJpdmF0ZV9kYXRhID0gZGV2OwogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vLCBmaWxlcCk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvS2NvbmZpZyBiL2RyaXZlcnMvbWQvS2NvbmZpZwppbmRleCAwN2Q5MmMxLi4yMjgxYjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL0tjb25maWcKKysrIGIvZHJpdmVycy9tZC9LY29uZmlnCkBAIC0zMCw2ICszMCwyMCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTURfQVVUT0RFVEVDVAorCWJvb2wgIkF1dG9kZXRlY3QgUkFJRCBhcnJheXMgZHVyaW5nIGtlcm5lbCBib290IgorCWRlcGVuZHMgb24gQkxLX0RFVl9NRD15CisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZW4gdGhlIGtlcm5lbCB3aWxsIHRyeSB0byBhdXRvZGV0ZWN0IHJhaWQKKwkgIGFycmF5cyBhcyBwYXJ0IG9mIGl0cyBib290IHByb2Nlc3MuIAorCisJICBJZiB5b3UgZG9uJ3QgdXNlIHJhaWQgYW5kIHNheSBZLCB0aGlzIGF1dG9kZXRlY3Rpb24gY2FuIGNhdXNlIAorCSAgYSBzZXZlcmFsLXNlY29uZCBkZWxheSBpbiB0aGUgYm9vdCB0aW1lIGR1ZSB0byB2YXJpb3VzCisJICBzeW5jaHJvbmlzYXRpb24gc3RlcHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHN0ZXAuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKIGNvbmZpZyBNRF9MSU5FQVIKIAl0cmlzdGF0ZSAiTGluZWFyIChhcHBlbmQpIG1vZGUiCiAJZGVwZW5kcyBvbiBCTEtfREVWX01ECmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCAwZGFlMjQ1Li41ZWZmOGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTg3LDYgKzg3LDQ0IEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgVG9zaGliYSBNb2JpbGUgSU8gQ29udHJvbGxlciBUQzYzOTNYQgogCitjb25maWcgTUZEX1dNODQwMAorCXRyaXN0YXRlICJTdXBwb3J0IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg0MDAiCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIFdvbGZzb24gTWljcm9lbGVjcm9uaWNzIFdNODQwMCBQTUlDIGFuZCBhdWRpbworCSAgQ09ERUMuICBUaGlzIGRyaXZlciBhZGRzIHByb3ZpZGVzIGNvbW1vbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcKKwkgIHRoZSBkZXZpY2UsIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlCisJICB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZGV2aWNlLgorCitjb25maWcgTUZEX1dNODM1MAorCXRyaXN0YXRlCisKK2NvbmZpZyBNRkRfV004MzUwX0NPTkZJR19NT0RFXzAKKwlib29sCisJZGVwZW5kcyBvbiBNRkRfV004MzUwCisKK2NvbmZpZyBNRkRfV004MzUwX0NPTkZJR19NT0RFXzEKKwlib29sCisJZGVwZW5kcyBvbiBNRkRfV004MzUwCisKK2NvbmZpZyBNRkRfV004MzUwX0NPTkZJR19NT0RFXzIKKwlib29sCisJZGVwZW5kcyBvbiBNRkRfV004MzUwCisKK2NvbmZpZyBNRkRfV004MzUwX0NPTkZJR19NT0RFXzMKKwlib29sCisJZGVwZW5kcyBvbiBNRkRfV004MzUwCisKK2NvbmZpZyBNRkRfV004MzUwX0kyQworCXRyaXN0YXRlICJTdXBwb3J0IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzNTAgd2l0aCBJMkMiCisJc2VsZWN0IE1GRF9XTTgzNTAKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFRoZSBXTTgzNTAgaXMgYW4gaW50ZWdyYXRlZCBhdWRpbyBhbmQgcG93ZXIgbWFuYWdlbWVudAorCSAgc3Vic3lzdGVtIHdpdGggd2F0Y2hkb2cgYW5kIFJUQyBmdW5jdGlvbmFsaXR5IGZvciBlbWJlZGRlZAorCSAgc3lzdGVtcy4gIFRoaXMgb3B0aW9uIGVuYWJsZXMgY29yZSBzdXBwb3J0IGZvciB0aGUgV004MzUwIHdpdGgKKwkgIEkyQyBhcyB0aGUgY29udHJvbCBpbnRlcmZhY2UuICBBZGRpdGlvbmFsIG9wdGlvbnMgbXVzdCBiZQorCSAgc2VsZWN0ZWQgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBjaGlwLgorCiBlbmRtZW51CiAKIG1lbnUgIk11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL01ha2VmaWxlIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKaW5kZXggNmFiZWJlMy4uNzU5YjFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKQEAgLTEyLDYgKzEyLDExIEBACiBvYmotJChDT05GSUdfTUZEX1RDNjM4N1hCKQkrPSB0YzYzODd4Yi5vCiBvYmotJChDT05GSUdfTUZEX1RDNjM5M1hCKQkrPSB0YzYzOTN4Yi5vCiAKK29iai0kKENPTkZJR19NRkRfV004NDAwKQkrPSB3bTg0MDAtY29yZS5vCit3bTgzNTAtb2JqcwkJCTo9IHdtODM1MC1jb3JlLm8gd204MzUwLXJlZ21hcC5vIHdtODM1MC1ncGlvLm8KK29iai0kKENPTkZJR19NRkRfV004MzUwKQkrPSB3bTgzNTAubworb2JqLSQoQ09ORklHX01GRF9XTTgzNTBfSTJDKQkrPSB3bTgzNTAtaTJjLm8KKwogb2JqLSQoQ09ORklHX01GRF9DT1JFKQkJKz0gbWZkLWNvcmUubwogCiBvYmotJChDT05GSUdfTUNQKQkJKz0gbWNwLWNvcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhN2E1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKQEAgLTAsMCArMSwxMjczIEBACisvKgorICogd204MzUwLWNvcmUuYyAgLS0gIERldmljZSBhY2Nlc3MgZm9yIFdvbGZzb24gV004MzUwCisgKgorICogQ29weXJpZ2h0IDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QsIE1hcmsgQnJvd24KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9jb3JlLmg+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+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwMS5jIGIvZHJpdmVycy9uZXQvM2M1MDEuYwppbmRleCA1YmE0YmFiLi43ZDE1ZTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwMS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTAxLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAlBbm5hcG9saXMgTUQgMjE0MDMKIAogICAgIEZpeGVkIChhZ2FpbiEpIHRoZSBtaXNzaW5nIGludGVycnVwdCBsb2NraW5nIG9uIFRYL1JYIHNoaWZ0aW5nLgotCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogICAgIFJlbW92ZWQgY2FsbHMgdG8gaW5pdF9ldGhlcmRldiBzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLCBhbmQKICAgICBjbGVhbmVkIHVwIG1vZHVsYXJpemF0aW9uIGp1c3QgYSBiaXQuIFRoZSBkcml2ZXIgc3RpbGwgYWxsb3dzIG9ubHkKQEAgLTI5LDE2ICsyOSwxNiBAQAogICAgIHRoZSBib2FyZC4gTm93IGdldHRpbmcgMTUwSy9zZWNvbmQgRlRQIHdpdGggYSAzYzUwMSBjYXJkLiBTdGlsbCBwbGF5aW5nCiAgICAgd2l0aCBhIFRYLVRYIG9wdGltaXNhdGlvbiB0byBzZWUgaWYgd2UgY2FuIHRvdWNoIDE4MC0yMDBLL3NlY29uZCBhcyBzZWVtcwogICAgIHRoZW9yZXRpY2FsbHkgbWF4aW11bS4KLQkJMTk5NTA0MDIgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKwkJMTk5NTA0MDIgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogICAgIENsZWFuZWQgdXAgZm9yIDIuMy54IGJlY2F1c2Ugd2UgYnJva2UgU01QIG5vdy4KLQkJMjAwMDAyMDggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKwkJMjAwMDAyMDggQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogICAgIENoZWNrIHVwIHBhc3MgZm9yIDIuNS4gTm90aGluZyBzaWduaWZpY2FudCBjaGFuZ2VkCi0JCTIwMDIxMDA5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisJCTIwMDIxMDA5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAKICAgICBGaXhlZCB6ZXJvIGZpbGwgY29ybmVyIGNhc2UKLQkJMjAwMzAxMDQgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKwkJMjAwMzAxMDQgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogCiAgICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogCiBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQotCURSVl9OQU1FICIuYzogIiBEUlZfVkVSU0lPTiAiIEFsYW4gQ294IChhbGFuQHJlZGhhdC5jb20pLlxuIjsKKwlEUlZfTkFNRSAiLmM6ICIgRFJWX1ZFUlNJT04gIiBBbGFuIENveCAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKS5cbiI7CiAKIC8qCiAgKglCcmFpbmRhbWFnZSByZW1haW5pbmc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUxNS5jIGIvZHJpdmVycy9uZXQvM2M1MTUuYwppbmRleCBlNGUzMjQxLi5hMGY4YjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUxNS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTE1LmMKQEAgLTE4LDcgKzE4LDcgQEAKIAogCTIwMDEvMTEvMTcgLSBBZGRlZCBldGh0b29sIHN1cHBvcnQgKGpnYXJ6aWspCiAKLQkyMDAyLzEwLzI4IC0gTG9ja2luZyB1cGRhdGVzIGZvciAyLjUgKGFsYW5AcmVkaGF0LmNvbSkKKwkyMDAyLzEwLzI4IC0gTG9ja2luZyB1cGRhdGVzIGZvciAyLjUgKGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51aykKIAogKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggZTlkNTI5NC4uMWQ4YWYzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0yNDAwLDcgKzI0MDAsNyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgZWhlYS4KIAogY29uZmlnIEVOSUMKLQl0cmlzdGF0ZSAiRSwgdGhlIENpc2NvIDEwRyBFdGhlcm5ldCBOSUMiCisJdHJpc3RhdGUgIkNpc2NvIDEwRyBFdGhlcm5ldCBOSUMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBJTkVUCiAJc2VsZWN0IElORVRfTFJPCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKaW5kZXggYTBiNGM4NS4uNzM1ZmM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYworKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jCkBAIC00LDcgKzQsNyBAQAogICogICAgICAtIEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CiAgKgogICoJV2l0aCBtb3JlIHRoYW4gYSBsaXR0bGUgaGVscCBmcm9tOwotICoJLSBBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPiAKKyAqCS0gQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKiAgICAgIERlcml2ZWQgZnJvbToKICAqICAgICAgLSBza2VsZXRvbi5jOiBBIG5ldHdvcmsgZHJpdmVyIG91dGxpbmUgZm9yIGxpbnV4LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oIGIvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oCmluZGV4IDQ1NWVmNTIuLmJjOGUyNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2FkYXB0ZXIuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9hZGFwdGVyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9hZWwxMDAyLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9hZWwxMDAyLmMKaW5kZXggNzQ0ZmFjMC4uNWMzYzA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvYWVsMTAwMi5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2FlbDEwMDIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvY3hnYjMvY29tbW9uLmgKaW5kZXggNTkzZmI2NC4uZTMxMmQzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY29tbW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19jdGxfZGVmcy5oIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfY3RsX2RlZnMuaAppbmRleCA2YWQ5MjQwLi4xZDhkNDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19jdGxfZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2N0bF9kZWZzLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19kZWZzLmggYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19kZWZzLmgKaW5kZXggNDVlOTIxNi4uNDdlNTM3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2RlZnMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2lvY3RsLmggYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19pb2N0bC5oCmluZGV4IDNlOGQ1ZmEuLmIxOWU0MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2lvY3RsLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfaW9jdGwuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwppbmRleCBmMzE5ODVkLi4xYWNlNDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCmluZGV4IDBmNmZkNjMuLjI2NWFhOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmggYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmgKaW5kZXggN2EzNzkxMy4uZDUxNGU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2Zpcm13YXJlX2V4cG9ydHMuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2Zpcm13YXJlX2V4cG9ydHMuaAppbmRleCBiNzVkZGQ4Li4wZDliMGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9maXJtd2FyZV9leHBvcnRzLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvZmlybXdhcmVfZXhwb3J0cy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvbDJ0LmMgYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYwppbmRleCBiMmM1MzE0Li40NDA3YWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2wydC5oIGIvZHJpdmVycy9uZXQvY3hnYjMvbDJ0LmgKaW5kZXggNDJjZTY1Zi4uZmQzZWIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvbDJ0LmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvbDJ0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9tYzUuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL21jNS5jCmluZGV4IDRjNGQ2ZTguLjNiNTUxN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL21jNS5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL21jNS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYwppbmRleCA4NzkxOTQxLi5jNjQ4MGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2NwbC5oIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNfY3BsLmgKaW5kZXggOTE3OTcwZS4uODUyYzM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvdDNfY3BsLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNfY3BsLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy90M19ody5jIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNfaHcuYwppbmRleCA0ZGE1YjA5Li45NjhmNjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy90M19ody5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy90M2NkZXYuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL3QzY2Rldi5oCmluZGV4IDBhMjFjZmIuLmJlNTVlOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3QzY2Rldi5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3QzY2Rldi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQ2hlbHNpbyBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3ZlcnNpb24uaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL3ZlcnNpb24uaAppbmRleCAyOWRiNzExLi5iYjg2OThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvdmVyc2lvbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBEUlZfREVTQyAiQ2hlbHNpbyBUMyBOZXR3b3JrIERyaXZlciIKICNkZWZpbmUgRFJWX05BTUUgImN4Z2IzIgogLyogRHJpdmVyIHZlcnNpb24gKi8KLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMC1rbyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMS4wLWtvIgogCiAvKiBGaXJtd2FyZSB2ZXJzaW9uICovCiAjZGVmaW5lIEZXX1ZFUlNJT05fTUFKT1IgNwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdnNjODIxMS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvdnNjODIxMS5jCmluZGV4IDMwNmMyZGMuLjMzZjk1NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3ZzYzgyMTEuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy92c2M4MjExLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy94Z21hYy5jIGIvZHJpdmVycy9uZXQvY3hnYjMveGdtYWMuYwppbmRleCBmZmRjMGExLi45ZDc3ODY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy94Z21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3hnbWFjLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXhwcmVzcy5jIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwppbmRleCA3OTVjNTk0Li5iNzUxYzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCisrKyBiL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKQEAgLTgsNyArOCw3IEBACiAgKgogICogTWFueSBtb2RpZmljYXRpb25zLCBhbmQgY3VycmVudGx5IG1haW50YWluZWQsIGJ5CiAgKiAgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgotICogQWRkZWQgdGhlIENvbXBhcSBMVEUgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiBBZGRlZCB0aGUgQ29tcGFxIExURSAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqIEFkZGVkIE1DQSBzdXBwb3J0IEFkYW0gRnJpdHpsZXIKICAqCiAgKiBOb3RlIC0gdGhpcyBkcml2ZXIgaXMgZXhwZXJpbWVudGFsIHN0aWxsIC0gaXQgaGFzIHByb2JsZW1zIG9uIGZhc3RlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19tYWluLmMKaW5kZXggZjNhNDdhOC4uMTgwZTk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfbWFpbi5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogCiAjaW5jbHVkZSAiY3FfZW5ldF9kZXNjLmgiCiAjaW5jbHVkZSAidm5pY19kZXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libWxhbmEuYyBiL2RyaXZlcnMvbmV0L2libWxhbmEuYwppbmRleCA5NWUzNDY0Li5mMDI3NjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1sYW5hLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtbGFuYS5jCkBAIC03MSw3ICs3MSw3IEBACiAgIEp1bmUgMXN0LCAyMDAwCiAJY29ycmVjdGVkIHZlcnNpb24gY29kZXMsIGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBsYXRlc3QgMi4zIGNoYW5nZXMKICAgT2N0IDI4dGgsIDIwMDIKLSAgCWNsZWFuZWQgdXAgZm9yIHRoZSAyLjUgdHJlZSA8YWxhbkByZWRoYXQuY29tPgorCWNsZWFuZWQgdXAgZm9yIHRoZSAyLjUgdHJlZSA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvam1lLmMgYi9kcml2ZXJzL25ldC9qbWUuYwppbmRleCAxNTZmMTU5Li44MWM2Y2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9qbWUuYworKysgYi9kcml2ZXJzL25ldC9qbWUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CiAjaW5jbHVkZSAiam1lLmgiCiAKIHN0YXRpYyBpbnQgZm9yY2VfcHNldWRvaHAgPSAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY21hY2UuYyBiL2RyaXZlcnMvbmV0L21hY21hY2UuYwppbmRleCA1MWFkMzc2Li44NTU4N2E2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjbWFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L21hY21hY2UuYwpAQCAtOSw3ICs5LDcgQEAKICAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgogICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgotICoJQ29weXJpZ2h0IChDKSAxOTk4IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKglDb3B5cmlnaHQgKEMpIDE5OTggQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKglNb2RpZmllZCBoZWF2aWx5IGJ5IEpvc2h1YSBNLiBUaG9tcHNvbiBiYXNlZCBvbiBEYXZlIEh1YW5nJ3MgTmV0QlNEIGRyaXZlcgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKaW5kZXggMGIyOGQwZC4uYzIzNWNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAgICBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KICAgICBEb25hbGQgQmVja2VyIG1heSBiZSByZWFjaGVkIGF0IGJlY2tlckBzY3lsZC5jb20KICAgICAKLSAgICBVcGRhdGVkIGZvciAyLjUueCBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICAgIFVwZGF0ZWQgZm9yIDIuNS54IGJ5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKaW5kZXggNTRkZjM0Zi4uNDQ4Y2Q0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwpAQCAtNjksNyArNjksNyBAQAogSGlzdG9yeQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTG9nOiBubWNsYW5fY3MuYyx2Ci0gKiAyLjUuNzUtYWMxIDIwMDMvMDcvMTEgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIDIuNS43NS1hYzEgMjAwMy8wNy8xMSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICogRml4ZWQgaGFuZyBvbiBjYXJkIGVqZWN0IGFzIHdlIHByb2JlIGl0CiAgKiBDbGVhbmVkIHVwIHRvIHVzZSBuZXcgc3R5bGUgbG9ja2luZy4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCmluZGV4IDY2NzFlMmQuLmQwZWQxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCkBAIC01NSw2ICs1NSw3IEBACiAKIC8qKgogICogbWRpb2J1c19yZWxlYXNlIC0gbWlpX2J1cyBkZXZpY2UgcmVsZWFzZSBjYWxsYmFjaworICogQGQ6IHRoZSB0YXJnZXQgc3RydWN0IGRldmljZSB0aGF0IGNvbnRhaW5zIHRoZSBtaWlfYnVzCiAgKgogICogRGVzY3JpcHRpb246IGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhbiBtaWlfYnVzIGlzCiAgKiBkcm9wcGVkLCB0byBmcmVlIHRoZSB1bmRlcmx5aW5nIG1lbW9yeS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCmluZGV4IDE3MTYyNzQuLmYxMWU5MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwpAQCAtNTU3LDYgKzU1Nyw3IEBACiAKIAlyZXR1cm4gY3RsOwogfQorRVhQT1JUX1NZTUJPTChnZW5waHlfcmVzdGFydF9hbmVnKTsKIAogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKaW5kZXggYzM3ZWE0My4uMzgxMTZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKQEAgLTU4LDcgKzU4LDcgQEAKICAqLwogI2lmIChQQUdFX1NISUZUID09IDEyKSB8fCAoUEFHRV9TSElGVCA9PSAxMykJLyogNGsgJiA4ayBwYWdlcyAqLwogI2RlZmluZSBUWF9ERVNDX1BFUl9PQUwgKChNQVhfU0tCX0ZSQUdTIC0gVFhfREVTQ19QRVJfSU9DQikgKyAyKQotI2VsaWYgKFBBR0VfU0hJRlQgPT0gMTYpCS8qIDY0ayBwYWdlcyAqLworI2Vsc2UgLyogYWxsIG90aGVyIHBhZ2Ugc2l6ZXMgKi8KICNkZWZpbmUgVFhfREVTQ19QRVJfT0FMIDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYwppbmRleCAyOTc4NzdiLi40YjJjYWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KIAogI2luY2x1ZGUgInFsZ2UuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGxhbi5jIGIvZHJpdmVycy9uZXQvdGxhbi5jCmluZGV4IGVjODcxZjYuLmM0MWQ2ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RsYW4uYworKysgYi9kcml2ZXJzL25ldC90bGFuLmMKQEAgLTI5LDcgKzI5LDggQEAKICAqCiAgKglUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPjoJVExhbl9QY2lQcm9iZSgpIG5vdyB1c2VzCiAgKgkJCQkJCW5ldyBQQ0kgQklPUyBpbnRlcmZhY2UuCi0gKglBbGFuIENveAk8YWxhbkByZWRoYXQuY29tPjoJRml4ZWQgdGhlIG91dCBvZiBtZW1vcnkKKyAqCUFsYW4gQ294CTxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+OgorICoJCQkJCQlGaXhlZCB0aGUgb3V0IG9mIG1lbW9yeQogICoJCQkJCQloYW5kbGluZy4KICAqCiAgKglUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+IE5ldyBNYWludGFpbmVyIQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwppbmRleCBmYTczZTZlLi5lZDUwZDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMjUsNyArMjUsNyBAQAogICogIFRvIGRvOgogICogICAgMS4gTXVsdGljYXN0IHN1cHBvcnQuCiAgKgotICogIEluaXRpYWwgMi41IGNsZWFudXAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gIDIwMDIvMTAvMjgKKyAqICBJbml0aWFsIDIuNSBjbGVhbnVwIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+ICAyMDAyLzEwLzI4CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCmluZGV4IGY1NGM0NTAuLjEyNGQ1ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKQEAgLTE2ODgsNiArMTY4OCw3IEBACiAJdW5zaWduZWQgaTsKIAogCWR3MzIgKFJPTUNtZCwgMCk7CS8qIFJlc2V0IHRoZSBwb2ludGVyIHdpdGggYSBkdW1teSB3cml0ZS4gKi8KKwl1ZGVsYXkoNSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCWludCB2YWx1ZSwgYm9ndXNjbnQgPSAxMDAwMDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKaW5kZXggNjU2MjAwNC4uOGU0NmE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtMjMsNyArMjMsNyBAQAogICAgIE1hcmNlbG8gVG9zYXR0aSA8bWFyY2Vsb0Bjb25lY3RpdmEuY29tLmJyPiA6CiAgICAgTWFkZSBpdCBjb21waWxlIGluIDIuMyAoZGV2aWNlIHRvIG5ldF9kZXZpY2UpCiAKLSAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiA6CisgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4gOgogICAgIENsZWFuZWQgdXAgZm9yIGtlcm5lbCBtZXJnZS4KICAgICBSZW1vdmVkIHRoZSBiYWNrIGNvbXBhdGliaWxpdHkgc3VwcG9ydAogICAgIFJlZm9ybWF0dGVkLCBmaXhpbmcgc3BlbGxpbmcgZXRjIGFzIEkgd2VudApAQCAtNDksNyArNDksNyBAQAogICAgIHN1cHBvcnQuICBVcGRhdGVkIFBDSSByZXNvdXJjZSBhbGxvY2F0aW9uLiAgRG8gbm90CiAgICAgZm9yZ2V0IHRvIHVubWFwIFBDSSBtYXBwZWQgc2ticy4KIAotICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAgICBBZGRlZCBuZXcgUENJIGlkZW50aWZpZXJzIHByb3ZpZGVkIGJ5IENsZWFyIFpoYW5nIGF0IEFMaQogICAgIGZvciB0aGVpciAxNTYzIGV0aGVybmV0IGRldmljZS4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwppbmRleCBhZDIwZjk2Li4yZGNlZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpAQCAtMTIsNyArMTIsNyBAQAogICoJU2NhdHRlciBnYXRoZXIKICAqCU1vcmUgdGVzdGluZwogICoKLSAqIFRoZSBjaGFuZ2VzIGFyZSAoYykgQ29weXJpZ2h0IDIwMDQsIFJlZCBIYXQgSW5jLiA8YWxhbkByZWRoYXQuY29tPgorICogVGhlIGNoYW5nZXMgYXJlIChjKSBDb3B5cmlnaHQgMjAwNCwgUmVkIEhhdCBJbmMuIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiBBZGRpdGlvbmFsIGZpeGVzIGFuZCBjbGVhbiB1cDogRnJhbmNvaXMgUm9taWV1CiAgKgogICogVGhpcyBzb3VyY2UgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIGZvciB1c2UgaW4gc2FmZXR5IGNyaXRpY2FsIHN5c3RlbXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMgYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKaW5kZXggMjQzYmQ4ZC4uY2NkOWNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwpAQCAtMTgsNyArMTgsOCBAQAogICoJRE1BIG5vdyB1c2VzIGdldF9mcmVlX3BhZ2UgYXMga21hbGxvYyBidWZmZXJzIG1heSBzcGFuIGEgNjRLIAogICoJYm91bmRhcnkuCiAgKgotICoJTW9kaWZpZWQgZm9yIFNNUCBzYWZldHkgYW5kIFNNUCBsb2NraW5nIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKglNb2RpZmllZCBmb3IgU01QIHNhZmV0eSBhbmQgU01QIGxvY2tpbmcgYnkgQWxhbiBDb3gKKyAqCQkJCQk8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqCVBlcmZvcm1hbmNlCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5oIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5oCmluZGV4IDRmMzcyMzkuLjg1YjNlNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuaAorKysgYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmgKQEAgLTIsNyArMiw3IEBACiAgKglEZXNjcmlwdGlvbiBvZiBaODUzMCBaODVDMzAgYW5kIFo4NTIzMCBjb21tdW5pY2F0aW9ucyBjaGlwcwogICoKICAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICovCiAKICNpZm5kZWYgX1o4NTMwX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwppbmRleCAxMzYyMjBiLi5lOTM5YTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCkBAIC00Mzg3LDcgKzQzODcsNyBAQAogICoKICAqIFRoYW5rcyBnbyBhbHNvIHRvOgogICoJSmFtZXMgQXNodG9uIChqYWExMDFAc3lzZW5nLmFudS5lZHUuYXUpLAotICoJQWxhbiBDb3ggKGFsYW5AcmVkaGF0LmNvbSksCisgKglBbGFuIENveCAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKSwKICAqCUFsbGFuIENyZWlnaHRvbiAoYWxsYW5jQGNzLnVzeWQuZWR1LmF1KSwKICAqCU1hdHRoZXcgR2VpZXIgKG1hdHRoZXdAY3MudXN5ZC5lZHUuYXUpLAogICoJUmVtbyBkaSBHaW92YW5uaSAocmVtb0Bjcy51c3lkLmVkdS5hdSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLnAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4ucC5oCmluZGV4IGIzM2FjNDcuLjQ0ZDMxYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4ucC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4ucC5oCkBAIC0xODYsNyArMTg2LDcgQEAKICAqCiAgKiBUaGFua3MgZ28gYWxzbyB0bzoKICAqCUphbWVzIEFzaHRvbiA8amFhMTAxQHN5c2VuZy5hbnUuZWR1LmF1PiwKLSAqCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LAorICoJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4sCiAgKglBbGxhbiBDcmVpZ2h0b24gPGFsbGFuY0Bjcy51c3lkLmVkdS5hdT4sCiAgKglNYXR0aGV3IEdlaWVyIDxtYXR0aGV3QGNzLnVzeWQuZWR1LmF1PiwKICAqCVJlbW8gZGkgR2lvdmFubmkgPHJlbW9AY3MudXN5ZC5lZHUuYXU+LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfZWJkYS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfZWJkYS5jCmluZGV4IDg0NjdkMDIuLjdkMjc2MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2ViZGEuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9lYmRhLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCWlvdW5tYXAgKGlvX21lbSk7CiAJZGVidWcgKCJyZXR1cm5lZCBlYmRhIHNlZ21lbnQ6ICV4XG4iLCBlYmRhX3NlZyk7CiAJCi0JaW9fbWVtID0gaW9yZW1hcCAoZWJkYV9zZWc8PDQsIDY1MDAwKTsKKwlpb19tZW0gPSBpb3JlbWFwKGViZGFfc2VnPDw0LCAxMDI0KTsKIAlpZiAoIWlvX21lbSApCiAJCXJldHVybiAtRU5PTUVNOwogCW5leHRfb2Zmc2V0ID0gMHgxODA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCmluZGV4IDNhYmJmYWQuLmQ1ZTIxMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBAIC0zNzgsMTEgKzM3OCwxMCBAQAogCWFsaWduID0gMDsKIAltaW5fYWxpZ24gPSAwOwogCWZvciAob3JkZXIgPSAwOyBvcmRlciA8PSBtYXhfb3JkZXI7IG9yZGVyKyspIHsKLSNpZmRlZiBDT05GSUdfUkVTT1VSQ0VTXzY0QklUCi0JCXJlc291cmNlX3NpemVfdCBhbGlnbjEgPSAxVUxMIDw8IChvcmRlciArIDIwKTsKLSNlbHNlCi0JCXJlc291cmNlX3NpemVfdCBhbGlnbjEgPSAxVSA8PCAob3JkZXIgKyAyMCk7Ci0jZW5kaWYKKwkJcmVzb3VyY2Vfc2l6ZV90IGFsaWduMSA9IDE7CisKKwkJYWxpZ24xIDw8PSAob3JkZXIgKyAyMCk7CisKIAkJaWYgKCFhbGlnbikKIAkJCW1pbl9hbGlnbiA9IGFsaWduMTsKIAkJZWxzZSBpZiAoQUxJR04oYWxpZ24gKyBtaW5fYWxpZ24sIG1pbl9hbGlnbikgPCBhbGlnbjEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCBhNjU2MTI4Li40ZGFkYTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTU2LDQgKzU2LDI4IEBACiAJICBjaGFyZ2luZyBzZWxlY3QgYmV0d2VlbiAxMDAgbUEgYW5kIDUwMCBtQSBjaGFyZ2luZyBjdXJyZW50CiAJICBsaW1pdC4KIAorY29uZmlnIFJFR1VMQVRPUl9XTTgzNTAKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uY2lzIFdNODM1MCBBdWRpb1BsdXMgUE1JQyIKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKwlzZWxlY3QgUkVHVUxBVE9SCisJaGVscAorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIHZvbHRhZ2UgYW5kIGN1cnJlbnQgcmVndWxhdG9ycworICAgICAgICAgIG9mIHRoZSBXTTgzNTAgQXVkaW9QbHVzIFBNSUMuCisKK2NvbmZpZyBSRUdVTEFUT1JfV004NDAwCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmNpcyBXTTg0MDAgQXVkaW9QbHVzIFBNSUMiCisJZGVwZW5kcyBvbiBNRkRfV004NDAwCisJc2VsZWN0IFJFR1VMQVRPUgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSB2b2x0YWdlIHJlZ3VsYXRvcnMgb2YgdGhlCisJICBXTTg0MDAgQXVkaW9QbHVzIFBNSUMuCisKK2NvbmZpZyBSRUdVTEFUT1JfREE5MDNYCisJdHJpc3RhdGUgIlN1cHBvcnQgcmVndWxhdG9ycyBvbiBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzAvREE5MDM0IFBNSUMiCisJZGVwZW5kcyBvbiBQTUlDX0RBOTAzWAorCXNlbGVjdCBSRUdVTEFUT1IKKwloZWxwCisJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIEJVQ0tzIGFuZCBMRE9zIHJlZ3VsYXRvcnMgZm91bmQgb24KKwkgIERpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzMC9EQTkwMzQgUE1JQy4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQppbmRleCBhYzJjNjRlLi4yNTRkNDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQpAQCAtOCw1ICs4LDggQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUikgKz0gdmlydHVhbC5vCiAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMikgKz0gYnEyNDAyMi5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1dNODM1MCkgKz0gd204MzUwLXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1dNODQwMCkgKz0gd204NDAwLXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX0RBOTAzWCkJKz0gZGE5MDN4Lm8KIAogY2NmbGFncy0kKENPTkZJR19SRUdVTEFUT1JfREVCVUcpICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2JxMjQwMjIuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2JxMjQwMjIuYwppbmRleCAyNjM2OTlkLi4zNjY1NjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9icTI0MDIyLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYnEyNDAyMi5jCkBAIC0xOCwxMyArMTgsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvYnEyNDAyMi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KIAorCiBzdGF0aWMgaW50IGJxMjQwMjJfc2V0X2N1cnJlbnRfbGltaXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJCWludCBtaW5fdUEsIGludCBtYXhfdUEpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0Jc3RydWN0IGJxMjQwMjJfbWFjaF9pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBicTI0MDIyX21hY2hfaW5mbyAqcGRhdGEgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCi0JZGV2X2RiZygmcGRldi0+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+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldNODQwMCByZWd1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODQwMC1yZWd1bGF0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMgYi9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCmluZGV4IGIyM2FmMGMuLjk2M2FkMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWNtb3MuYwpAQCAtOTEzLDYgKzkxMyw5MiBAQAogICogcHJlZGF0ZSBldmVuIFBOUEJJT1Mgc2hvdWxkIHNldCB1cCBwbGF0Zm9ybV9idXMgZGV2aWNlcy4KICAqLwogCisjaWZkZWYJQ09ORklHX0FDUEkKKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworI2lmZGVmCUNPTkZJR19QTQorc3RhdGljIHUzMiBydGNfaGFuZGxlcih2b2lkICpjb250ZXh0KQoreworCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOworCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7CisJcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGNfd2FrZV9zZXR1cCh2b2lkKQoreworCWFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfUlRDLCBydGNfaGFuZGxlciwgTlVMTCk7CisJLyoKKwkgKiBBZnRlciB0aGUgUlRDIGhhbmRsZXIgaXMgaW5zdGFsbGVkLCB0aGUgRml4ZWRfUlRDIGV2ZW50IHNob3VsZAorCSAqIGJlIGRpc2FibGVkLiBPbmx5IHdoZW4gdGhlIFJUQyBhbGFybSBpcyBzZXQgd2lsbCBpdCBiZSBlbmFibGVkLgorCSAqLworCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOworCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0Y193YWtlX29uKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUlRDKTsKKwlhY3BpX2VuYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0Y193YWtlX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYWNwaV9kaXNhYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKK30KKyNlbHNlCisjZGVmaW5lIHJ0Y193YWtlX3NldHVwKCkJZG97fXdoaWxlKDApCisjZGVmaW5lIHJ0Y193YWtlX29uCQlOVUxMCisjZGVmaW5lIHJ0Y193YWtlX29mZgkJTlVMTAorI2VuZGlmCisKKy8qIEV2ZXJ5IEFDUEkgcGxhdGZvcm0gaGFzIGEgbWMxNDY4MTggY29tcGF0aWJsZSAiY21vcyBydGMiLiAgSGVyZSB3ZSBmaW5kCisgKiBpdHMgZGV2aWNlIG5vZGUgYW5kIHBhc3MgZXh0cmEgY29uZmlnIGRhdGEuICBUaGlzIGhlbHBzIGl0cyBkcml2ZXIgdXNlCisgKiBjYXBhYmlsaXRpZXMgdGhhdCB0aGUgbm93LW9ic29sZXRlIG1jMTQ2ODE4IGRpZG4ndCBoYXZlLCBhbmQgaW5mb3JtcyBpdAorICogdGhhdCB0aGlzIGJvYXJkJ3MgUlRDIGlzIHdha2V1cC1jYXBhYmxlIChwZXIgQUNQSSBzcGVjKS4KKyAqLworc3RhdGljIHN0cnVjdCBjbW9zX3J0Y19ib2FyZF9pbmZvIGFjcGlfcnRjX2luZm87CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorY21vc193YWtlX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCisJcnRjX3dha2Vfc2V0dXAoKTsKKwlhY3BpX3J0Y19pbmZvLndha2Vfb24gPSBydGNfd2FrZV9vbjsKKwlhY3BpX3J0Y19pbmZvLndha2Vfb2ZmID0gcnRjX3dha2Vfb2ZmOworCisJLyogd29ya2Fyb3VuZCBidWcgaW4gc29tZSBBQ1BJIHRhYmxlcyAqLworCWlmIChhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtICYmICFhY3BpX2dibF9GQURULmRheV9hbGFybSkgeworCQlkZXZfZGJnKGRldiwgImJvZ3VzIEZBRFQgbW9udGhfYWxhcm0gKCVkKVxuIiwKKwkJCWFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0pOworCQlhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtID0gMDsKKwl9CisKKwlhY3BpX3J0Y19pbmZvLnJ0Y19kYXlfYWxhcm0gPSBhY3BpX2dibF9GQURULmRheV9hbGFybTsKKwlhY3BpX3J0Y19pbmZvLnJ0Y19tb25fYWxhcm0gPSBhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtOworCWFjcGlfcnRjX2luZm8ucnRjX2NlbnR1cnkgPSBhY3BpX2dibF9GQURULmNlbnR1cnk7CisKKwkvKiBOT1RFOiAgUzRfUlRDX1dBS0UgaXMgTk9UIGN1cnJlbnRseSB1c2VmdWwgdG8gTGludXggKi8KKwlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9TNF9SVENfV0FLRSkKKwkJZGV2X2luZm8oZGV2LCAiUlRDIGNhbiB3YWtlIGZyb20gUzRcbiIpOworCisJZGV2LT5wbGF0Zm9ybV9kYXRhID0gJmFjcGlfcnRjX2luZm87CisKKwkvKiBSVEMgYWx3YXlzIHdha2VzIGZyb20gUzEvUzIvUzMsIGFuZCBvZnRlbiBTNC9TVEQgKi8KKwlkZXZpY2VfaW5pdF93YWtldXAoZGV2LCAxKTsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgX19kZXZpbml0CitjbW9zX3dha2Vfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQoreworfQorCisjZW5kaWYKKwogI2lmZGVmCUNPTkZJR19QTlAKIAogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgpAQCAtOTIwLDYgKzEwMDYsOCBAQAogc3RhdGljIGludCBfX2RldmluaXQKIGNtb3NfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpwbnAsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICppZCkKIHsKKwljbW9zX3dha2Vfc2V0dXAoJnBucC0+ZGV2KTsKKwogCWlmIChwbnBfcG9ydF9zdGFydChwbnAsMCkgPT0gMHg3MCAmJiAhcG5wX2lycV92YWxpZChwbnAsMCkpCiAJCS8qIFNvbWUgbWFjaGluZXMgY29udGFpbiBhIFBOUCBlbnRyeSBmb3IgdGhlIFJUQywgYnV0CiAJCSAqIGRvbid0IGRlZmluZSB0aGUgSVJRLiBJdCBzaG91bGQgYWx3YXlzIGJlIHNhZmUgdG8KQEAgLTk5Nyw2ICsxMDg1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgY21vc19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWNtb3Nfd2FrZV9zZXR1cCgmcGRldi0+ZGV2KTsKIAlyZXR1cm4gY21vc19kb19wcm9iZSgmcGRldi0+ZGV2LAogCQkJcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApLAogCQkJcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKSk7CkBAIC0xMDMxLDI5ICsxMTIwLDMyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNtb3NfaW5pdCh2b2lkKQogeworCWludCByZXR2YWwgPSAwOworCiAjaWZkZWYJQ09ORklHX1BOUAotCWlmIChwbnBfcGxhdGZvcm1fZGV2aWNlcykKLQkJcmV0dXJuIHBucF9yZWdpc3Rlcl9kcml2ZXIoJmNtb3NfcG5wX2RyaXZlcik7Ci0JZWxzZQotCQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZjbW9zX3BsYXRmb3JtX2RyaXZlciwKLQkJCWNtb3NfcGxhdGZvcm1fcHJvYmUpOwotI2Vsc2UKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZjbW9zX3BsYXRmb3JtX2RyaXZlciwKLQkJCWNtb3NfcGxhdGZvcm1fcHJvYmUpOwotI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KKwlwbnBfcmVnaXN0ZXJfZHJpdmVyKCZjbW9zX3BucF9kcml2ZXIpOworI2VuZGlmCisKKwlpZiAoIWNtb3NfcnRjLmRldikKKwkJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZjbW9zX3BsYXRmb3JtX2RyaXZlciwKKwkJCQkJICAgICAgIGNtb3NfcGxhdGZvcm1fcHJvYmUpOworCisJaWYgKHJldHZhbCA9PSAwKQorCQlyZXR1cm4gMDsKKworI2lmZGVmCUNPTkZJR19QTlAKKwlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJmNtb3NfcG5wX2RyaXZlcik7CisjZW5kaWYKKwlyZXR1cm4gcmV0dmFsOwogfQogbW9kdWxlX2luaXQoY21vc19pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IGNtb3NfZXhpdCh2b2lkKQogewogI2lmZGVmCUNPTkZJR19QTlAKLQlpZiAocG5wX3BsYXRmb3JtX2RldmljZXMpCi0JCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmY21vc19wbnBfZHJpdmVyKTsKLQllbHNlCi0JCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjbW9zX3BsYXRmb3JtX2RyaXZlcik7Ci0jZWxzZQorCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmY21vc19wbnBfZHJpdmVyKTsKKyNlbmRpZgogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjbW9zX3BsYXRmb3JtX2RyaXZlcik7Ci0jZW5kaWYgLyogQ09ORklHX1BOUCAqLwogfQogbW9kdWxlX2V4aXQoY21vc19leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwppbmRleCA4ZjgzZmM5Li5mNWU2MTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwpAQCAtMjkxMyw3ICsyOTEzLDcgQEAKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJImNsYXc6IGNjd19kZXZpY2Vfc2V0X29ubGluZSAlcyBXUklURSBmYWlsZWQgIgotCQkgICAgICAgIndpdGggcmV0ID0gJWRcbiIsIGRldl9uYW1lKCZjZ2Rldi0+Y2RldltXUklURV0tPmRldikKKwkJICAgICAgICJ3aXRoIHJldCA9ICVkXG4iLCBkZXZfbmFtZSgmY2dkZXYtPmNkZXZbV1JJVEVdLT5kZXYpLAogCQkgICAgICAgcmV0KTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCBkM2IyMTFhLi40MDNlY2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtMTY0MCw2ICsxNjQwLDcgQEAKIAl0cmlzdGF0ZSAiQXRhcmkgbmF0aXZlIFNDU0kgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFUQVJJICYmIFNDU0kKIAlzZWxlY3QgU0NTSV9TUElfQVRUUlMKKwlzZWxlY3QgTlZSQU0KIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhbiBBdGFyaSB3aXRoIGJ1aWx0LWluIE5DUjUzODAgU0NTSSBjb250cm9sbGVyIChUVCwKIAkgIEZhbGNvbiwgLi4uKSBzYXkgWSB0byBnZXQgaXQgc3VwcG9ydGVkLiBPZiBjb3Vyc2UgYWxzbywgaWYgeW91IGhhdmUKQEAgLTE2NzAsMTQgKzE2NzEsNiBAQAogCSAgYm9vdCBwcm9jZXNzIGZyYWN0aW9uYWxseSBsb25nZXIgYnV0IG1heSBhc3Npc3QgcmVjb3ZlcnkgZnJvbSBlcnJvcnMKIAkgIHRoYXQgbGVhdmUgdGhlIGRldmljZXMgd2l0aCBTQ1NJIG9wZXJhdGlvbnMgcGFydHdheSBjb21wbGV0ZWQuCiAKLWNvbmZpZyBUVF9ETUFfRU1VTAotCWJvb2wgIkhhZGVzIFNDU0kgRE1BIGVtdWxhdG9yIgotCWRlcGVuZHMgb24gQVRBUklfU0NTSSAmJiBIQURFUwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgY29kZSB3aGljaCBlbXVsYXRlcyB0aGUgVFQgU0NTSSBETUEgY2hpcCBvbiB0aGUKLQkgIEhhZGVzLiBUaGlzIGluY3JlYXNlcyB0aGUgU0NTSSB0cmFuc2ZlciByYXRlcyBhdCBsZWFzdCB0ZW4gdGltZXMKLQkgIGNvbXBhcmVkIHRvIFBJTyB0cmFuc2ZlcnMuCi0KIGNvbmZpZyBNQUNfU0NTSQogCWJvb2wgIk1hY2ludG9zaCBOQ1I1MzgwIFNDU0kiCiAJZGVwZW5kcyBvbiBNQUMgJiYgU0NTST15CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXRhcmlfZG1hX2VtdWwuYyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9kbWFfZW11bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGM3MTBlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS9hdGFyaV9kbWFfZW11bC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qCi0gKiBhdGFyaV9kbWFfZW11bC5jIC0tIFRUIFNDU0kgRE1BIGVtdWxhdG9yIGZvciB0aGUgSGFkZXMuCi0gKgotICogQ29weXJpZ2h0IDE5OTcgV291dCBLbGFyZW4gPFcuS2xhcmVuQGludGVyLm5sLm5ldD4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIHVzaW5nIHRoZSBIYWRlcyBUT1Mgc291cmNlIGNvZGUgYXMgYQotICogcmVmZXJlbmNlLiBUaGlzIHNvdXJjZSBjb2RlIGNhbiBiZSBmb3VuZCBvbiB0aGUgaG9tZSBwYWdlCi0gKiBvZiBNZWR1c2EgQ29tcHV0ZXIgU3lzdGVtcy4KLSAqCi0gKiBWZXJzaW9uIDAuMSwgMTk5Ny0wOS0yNC4KLSAqIAotICogVGhpcyBjb2RlIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gSXQgaGFzIG9ubHkgYmVlbgotICogdGVzdGVkIG9uIGEgSGFkZXMgd2l0aCBhIDY4MDYwLiBJdCBtaWdodCBub3Qgd29yayBvbiBhIEhhZGVzCi0gKiB3aXRoIGEgNjgwNDAuIE1ha2UgYmFja3VwcyBvZiB5b3VyIGhhcmQgZHJpdmVzIGJlZm9yZSB1c2luZwotICogdGhpcyBjb2RlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNkZWZpbmUgaGFkZXNfZG1hX2N0cmwJCSgqKHVuc2lnbmVkIGNoYXIgKikgMHhmZmZmODcxNykKLSNkZWZpbmUgaGFkZXNfcHNkbV9yZWcJCSgqKHVuc2lnbmVkIGNoYXIgKikgMHhmZmZmODc0MSkKLQotI2RlZmluZSBUUkFOU0ZFUl9TSVpFCQkxNgotCi1zdHJ1Y3QgbTY4MDQwX2ZyYW1lIHsKLQl1bnNpZ25lZCBsb25nICBlZmZhZGRyOyAgLyogZWZmZWN0aXZlIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBzaG9ydCBzc3c7ICAgICAgLyogc3BlY2lhbCBzdGF0dXMgd29yZCAqLwotCXVuc2lnbmVkIHNob3J0IHdiM3M7ICAgICAvKiB3cml0ZSBiYWNrIDMgc3RhdHVzICovCi0JdW5zaWduZWQgc2hvcnQgd2IyczsgICAgIC8qIHdyaXRlIGJhY2sgMiBzdGF0dXMgKi8KLQl1bnNpZ25lZCBzaG9ydCB3YjFzOyAgICAgLyogd3JpdGUgYmFjayAxIHN0YXR1cyAqLwotCXVuc2lnbmVkIGxvbmcgIGZhZGRyOyAgICAvKiBmYXVsdCBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgd2IzYTsgICAgIC8qIHdyaXRlIGJhY2sgMyBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgd2IzZDsgICAgIC8qIHdyaXRlIGJhY2sgMyBkYXRhICovCi0JdW5zaWduZWQgbG9uZyAgd2IyYTsgICAgIC8qIHdyaXRlIGJhY2sgMiBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgd2IyZDsgICAgIC8qIHdyaXRlIGJhY2sgMiBkYXRhICovCi0JdW5zaWduZWQgbG9uZyAgd2IxYTsgICAgIC8qIHdyaXRlIGJhY2sgMSBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgd2IxZHBkMDsgIC8qIHdyaXRlIGJhY2sgMSBkYXRhL3B1c2ggZGF0YSAwKi8KLQl1bnNpZ25lZCBsb25nICBwZDE7ICAgICAgLyogcHVzaCBkYXRhIDEqLwotCXVuc2lnbmVkIGxvbmcgIHBkMjsgICAgICAvKiBwdXNoIGRhdGEgMiovCi0JdW5zaWduZWQgbG9uZyAgcGQzOyAgICAgIC8qIHB1c2ggZGF0YSAzKi8KLX07Ci0KLXN0YXRpYyB2b2lkIHdyaXRlYmFjayAodW5zaWduZWQgc2hvcnQgd2JzLCB1bnNpZ25lZCBsb25nIHdiYSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgd2JkLCB2b2lkICpvbGRfYnVzZXJyKQotewotCW1tX3NlZ21lbnRfdCBmcyA9IGdldF9mcygpOwotCXN0YXRpYyB2b2lkICpzYXZlX2J1c2VycjsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWMubAklJXZiciwlJWEwXG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJJTAsOCglJWEwKVxuXHQiCi0JCQkgICAgICA6Ci0JCQkgICAgICA6ICJyIiAoJiZidXNfZXJyb3IpCi0JCQkgICAgICA6ICJhMCIgKTsKLQotCXNhdmVfYnVzZXJyID0gb2xkX2J1c2VycjsKLQotCXNldF9mcyAoTUFLRV9NTV9TRUcod2JzICYgV0JUTV8wNDApKTsKLQotCXN3aXRjaCAod2JzICYgV0JTSVpfMDQwKSB7Ci0JICAgIGNhc2UgQkFfU0laRV9CWVRFOgotCQlwdXRfdXNlciAod2JkICYgMHhmZiwgKGNoYXIgKil3YmEpOwotCQlicmVhazsKLQkgICAgY2FzZSBCQV9TSVpFX1dPUkQ6Ci0JCXB1dF91c2VyICh3YmQgJiAweGZmZmYsIChzaG9ydCAqKXdiYSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEJBX1NJWkVfTE9ORzoKLQkJcHV0X3VzZXIgKHdiZCwgKGludCAqKXdiYSk7Ci0JCWJyZWFrOwotCX0KLQotCXNldF9mcyAoZnMpOwotCXJldHVybjsKLQotYnVzX2Vycm9yOgotCV9fYXNtX18gX192b2xhdGlsZV9fICgiY21wLmwJJTAsMiglJXNwKVxuXHQiCi0JCQkgICAgICAiYmNzLnMJLmp1bXBfb2xkXG5cdCIKLQkJCSAgICAgICJjbXAubAklMSwyKCUlc3ApXG5cdCIKLQkJCSAgICAgICJibHMucwkucmVzdG9yZV9vbGRcbiIKLQkJCSIuanVtcF9vbGQ6XG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJJTIsLSglJXNwKVxuXHQiCi0JCQkgICAgICAicnRzXG4iCi0JCQkiLnJlc3RvcmVfb2xkOlxuXHQiCi0JCQkgICAgICAibW92ZS5sCSUlYTAsLSglJXNwKVxuXHQiCi0JCQkgICAgICAibW92ZWMubAklJXZiciwlJWEwXG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJJTIsOCglJWEwKVxuXHQiCi0JCQkgICAgICAibW92ZS5sCSglJXNwKSssJSVhMFxuXHQiCi0JCQkgICAgICAicnRlXG5cdCIKLQkJCSAgICAgIDoKLQkJCSAgICAgIDogImkiICh3cml0ZWJhY2spLCAiaSIgKCYmYnVzX2Vycm9yKSwKLQkJCSAgICAgICAgIm0iIChzYXZlX2J1c2VycikgKTsKLX0KLQotLyoKLSAqIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcmVzdGRhdGFfcmVnKHVuc2lnbmVkIGNoYXIgKmN1cl9hZGRyKQotICoKLSAqIFNldCB0aGUgcmVzdCBkYXRhIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Jlc3RkYXRhX3JlZyh1bnNpZ25lZCBjaGFyICpjdXJfYWRkcikKLXsKLQlpZiAoKChsb25nKSBjdXJfYWRkciAmIH4zKSAhPSAwKQotCQl0dF9zY3NpX2RtYS5kbWFfcmVzdGRhdGEgPQotCQkJKigodW5zaWduZWQgbG9uZyAqKSAoKGxvbmcpIGN1cl9hZGRyICYgfjMpKTsKLX0KLQotLyoKLSAqIHZvaWQgaGFkZXNfZG1hX2VtdWxhdG9yKGludCBpcnEsIHZvaWQgKmR1bW15KQotICogCi0gKiBUaGlzIGNvZGUgZW11bGF0ZXMgVFQgU0NTSSBETUEgb24gdGhlIEhhZGVzLgotICogCi0gKiBOb3RlIHRoZSBmb2xsb3dpbmc6Ci0gKiAKLSAqIDEuIFdoZW4gdGhlcmUgaXMgbm8gYnl0ZSBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIHRoZSBTQ1NJIGJ1cywgb3IKLSAqICAgIHdoZW4gYSBieXRlIGNhbm5vdCB5ZXQgYmV0IHdyaXR0ZW4gdG8gdGhlIFNDU0kgYnVzLCBhIGJ1cwotICogICAgZXJyb3Igb2NjdXJzIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIHRoZSBwc2V1ZG8gRE1BIGRhdGEKLSAqICAgIHJlZ2lzdGVyIChoYWRlc19wc2RtX3JlZykuIFdlIGhhdmUgdG8gY2F0Y2ggdGhpcyBidXMgZXJyb3IKLSAqICAgIGFuZCB0cnkgYWdhaW4gdG8gcmVhZCBvciB3cml0ZSB0aGUgYnl0ZS4gSWYgYWZ0ZXIgc2V2ZXJhbCB0cmllcwotICogICAgd2Ugc3RpbGwgZ2V0IGEgYnVzIGVycm9yLCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXMgbGVmdC4gV2hlbgotICogICAgdGhlIGJ5dGUgY2FuIGJlIHJlYWQgb3Igd3JpdHRlbiwgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzCi0gKiAgICBjYWxsZWQgYWdhaW4uCi0gKiAKLSAqIDIuIFRoZSBTQ1NJIGludGVycnVwdCBtdXN0IGJlIGRpc2FibGVkIGluIHRoaXMgaW50ZXJydXB0IGhhbmRsZXIuCi0gKiAKLSAqIDMuIElmIHdlIHNldCB0aGUgRU9QIHNpZ25hbCwgdGhlIFNDU0kgY29udHJvbGxlciBzdGlsbCBleHBlY3RzIG9uZQotICogICAgYnl0ZSB0byBiZSByZWFkIG9yIHdyaXR0ZW4uIFRoZXJlZm9yZSB0aGUgbGFzdCBieXRlIGlzIHRyYW5zZmVycmVkCi0gKiAgICBzZXBhcmF0ZWx5LCBhZnRlciBzZXR0aW5nIHRoZSBFT1Agc2lnbmFsLgotICogCi0gKiA0LiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgbGVmdCwgdGhlIGFkZHJlc3MgcG9pbnRlciAoc3RhcnRfYWRkcikgaXMKLSAqICAgIGNvbnZlcnRlZCB0byBhIHBoeXNpY2FsIGFkZHJlc3MuIEJlY2F1c2UgaXQgcG9pbnRzIG9uZSBieXRlCi0gKiAgICBmdXJ0aGVyIHRoYW4gdGhlIGxhc3QgdHJhbnNmZXJyZWQgYnl0ZSwgaXQgY2FuIHBvaW50IG91dHNpZGUgdGhlCi0gKiAgICBjdXJyZW50IHBhZ2UuIElmIHZpcnRfdG9fcGh5cygpIGlzIGNhbGxlZCB3aXRoIHRoaXMgYWRkcmVzcyB3ZQotICogICAgbWlnaHQgZ2V0IGFuIGFjY2VzcyBlcnJvci4gVGhlcmVmb3JlIHZpcnRfdG9fcGh5cygpIGlzIGNhbGxlZCB3aXRoCi0gKiAgICBzdGFydF9hZGRyIC0gMSBpZiB0aGUgY291bnQgaGFzIHJlYWNoZWQgemVyby4gVGhlIHJlc3VsdCBpcwotICogICAgaW5jcmVhc2VkIHdpdGggb25lLgotICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBoYWRlc19kbWFfZW11bGF0b3IoaW50IGlycSwgdm9pZCAqZHVtbXkpCi17Ci0JdW5zaWduZWQgbG9uZyBkbWFfYmFzZTsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGRtYV9jbnQgYXNtICgiZDMiKTsKLQlzdGF0aWMgbG9uZyBzYXZlX2J1c2VycjsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHNhdmVfc3AgYXNtICgiZDQiKTsKLQlyZWdpc3RlciBpbnQgdHJpZXMgYXNtICgiZDUiKTsKLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzdGFydF9hZGRyIGFzbSAoImEzIiksICplbmRfYWRkciBhc20gKCJhNCIpOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmVmZl9hZGRyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnBzZG1fcmVnOwotCXVuc2lnbmVkIGxvbmcgcmVtOwotCi0JYXRhcmlfZGlzYWJsZV9pcnEoSVJRX1RUX01GUF9TQ1NJKTsKLQotCS8qCi0JICogUmVhZCB0aGUgZG1hIGFkZHJlc3MgYW5kIGNvdW50IHJlZ2lzdGVycy4KLQkgKi8KLQotCWRtYV9iYXNlID0gU0NTSV9ETUFfUkVBRF9QKGRtYV9hZGRyKTsKLQlkbWFfY250ID0gU0NTSV9ETUFfUkVBRF9QKGRtYV9jbnQpOwotCi0JLyoKLQkgKiBDaGVjayBpZiBETUEgaXMgc3RpbGwgZW5hYmxlZC4KLQkgKi8KLQotCWlmICgodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAyKSA9PSAwKQotCXsKLQkJYXRhcmlfZW5hYmxlX2lycShJUlFfVFRfTUZQX1NDU0kpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGRtYV9jbnQgPT0gMCkKLQl7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiRE1BIGVtdWxhdGlvbjogY291bnQgaXMgemVyby5cbiIpOwotCQl0dF9zY3NpX2RtYS5kbWFfY3RybCAmPSAweGZkOwkvKiBETUEgcmVhZHkuICovCi0JCWF0YXJpX2VuYWJsZV9pcnEoSVJRX1RUX01GUF9TQ1NJKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCS8qCi0JICogSW5zdGFsbCBuZXcgYnVzIGVycm9yIHJvdXRpbmUuCi0JICovCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVjLmwJJSV2YnIsJSVhMFxuXHQiCi0JCQkgICAgICAibW92ZS5sCTgoJSVhMCksJTBcblx0IgotCQkJICAgICAgIm1vdmUubAklMSw4KCUlYTApXG5cdCIKLQkJCSAgICAgIDogIj0mciIgKHNhdmVfYnVzZXJyKQotCQkJICAgICAgOiAiciIgKCYmc2NzaV9idXNfZXJyb3IpCi0JCQkgICAgICA6ICJhMCIgKTsKLQotCWhhZGVzX2RtYV9jdHJsICY9IDB4ZmM7CQkvKiBCdXMgZXJyb3IgYW5kIEVPUCBvZmYuICovCi0KLQkvKgotCSAqIFNhdmUgdGhlIHN0YWNrIHBvaW50ZXIuCi0JICovCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmUubAklJXNwLCUwXG5cdCIKLQkJCSAgICAgIDogIj0mciIgKHNhdmVfc3ApICk7Ci0KLQl0cmllcyA9IDEwMDsJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBidXMgZXJyb3JzLiAqLwotCXN0YXJ0X2FkZHIgPSBwaHlzX3RvX3ZpcnQoZG1hX2Jhc2UpOwotCWVuZF9hZGRyID0gc3RhcnRfYWRkciArIGRtYV9jbnQ7Ci0KLXNjc2lfbG9vcDoKLQlkbWFfY250LS07Ci0JcmVtID0gZG1hX2NudCAmIChUUkFOU0ZFUl9TSVpFIC0gMSk7Ci0JZG1hX2NudCAmPSB+KFRSQU5TRkVSX1NJWkUgLSAxKTsKLQlwc2RtX3JlZyA9ICZoYWRlc19wc2RtX3JlZzsKLQotCWlmICh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpCS8qIFJlYWQgb3Igd3JpdGU/ICovCi0JewotCQkvKgotCQkgKiBTQ1NJIHdyaXRlLiBBYm9ydCB3aGVuIGNvdW50IGlzIHplcm8uCi0JCSAqLwotCi0JCXN3aXRjaCAocmVtKQotCQl7Ci0JCWNhc2UgMDoKLQkJCXdoaWxlIChkbWFfY250ID4gMCkKLQkJCXsKLQkJCQlkbWFfY250IC09IFRSQU5TRkVSX1NJWkU7Ci0KLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDE1OgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgMTQ6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSAxMzoKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDEyOgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgMTE6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSAxMDoKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDk6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSA4OgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgNzoKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDY6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSA1OgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgNDoKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDM6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSAyOgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgMToKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQkJfQotCQl9Ci0KLQkJaGFkZXNfZG1hX2N0cmwgfD0gMTsJLyogU2V0IEVPUC4gKi8KLQkJdWRlbGF5KDEwKTsKLQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsJLyogRHVtbXkgYnl0ZS4gKi8KLQkJdHRfc2NzaV9kbWEuZG1hX2N0cmwgJj0gMHhmZDsJLyogRE1BIHJlYWR5LiAqLwotCX0KLQllbHNlCi0JewotCQkvKgotCQkgKiBTQ1NJIHJlYWQuIEFib3J0IHdoZW4gY291bnQgaXMgemVyby4KLQkJICovCi0KLQkJc3dpdGNoIChyZW0pCi0JCXsKLQkJY2FzZSAwOgotCQkJd2hpbGUgKGRtYV9jbnQgPiAwKQotCQkJewotCQkJCWRtYV9jbnQgLT0gVFJBTlNGRVJfU0laRTsKLQotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgMTU6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSAxNDoKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDEzOgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgMTI6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSAxMToKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDEwOgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgOToKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDg6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSA3OgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgNjoKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDU6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSA0OgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgMzoKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDI6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSAxOgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCQl9Ci0JCX0KLQotCQloYWRlc19kbWFfY3RybCB8PSAxOwkvKiBTZXQgRU9QLiAqLwotCQl1ZGVsYXkoMTApOwotCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQl0dF9zY3NpX2RtYS5kbWFfY3RybCAmPSAweGZkOwkvKiBETUEgcmVhZHkuICovCi0KLQkJc2V0X3Jlc3RkYXRhX3JlZyhzdGFydF9hZGRyKTsKLQl9Ci0KLQlpZiAoc3RhcnRfYWRkciAhPSBlbmRfYWRkcikKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiRE1BIGVtdWxhdGlvbjogRkFUQUw6IENvdW50IGlzIG5vdCB6ZXJvIGF0IGVuZCBvZiB0cmFuc2Zlci5cbiIpOwotCi0JZG1hX2NudCA9IGVuZF9hZGRyIC0gc3RhcnRfYWRkcjsKLQotc2NzaV9lbmQ6Ci0JZG1hX2Jhc2UgPSAoZG1hX2NudCA9PSAwKSA/IHZpcnRfdG9fcGh5cyhzdGFydF9hZGRyIC0gMSkgKyAxIDogIAotCQkJCSAgICB2aXJ0X3RvX3BoeXMoc3RhcnRfYWRkcik7Ci0KLQlTQ1NJX0RNQV9XUklURV9QKGRtYV9hZGRyLCBkbWFfYmFzZSk7Ci0JU0NTSV9ETUFfV1JJVEVfUChkbWFfY250LCBkbWFfY250KTsKLQotCS8qCi0JICogUmVzdG9yZSBvbGQgYnVzIGVycm9yIHJvdXRpbmUuCi0JICovCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVjLmwJJSV2YnIsJSVhMFxuXHQiCi0JCQkgICAgICAibW92ZS5sCSUwLDgoJSVhMClcblx0IgotCQkJICAgICAgOgotCQkJICAgICAgOiAiciIgKHNhdmVfYnVzZXJyKQotCQkJICAgICAgOiAiYTAiICk7Ci0KLQlhdGFyaV9lbmFibGVfaXJxKElSUV9UVF9NRlBfU0NTSSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLXNjc2lfYnVzX2Vycm9yOgotCS8qCi0JICogRmlyc3QgY2hlY2sgaWYgdGhlIGJ1cyBlcnJvciBpcyBjYXVzZWQgYnkgb3VyIGNvZGUuCi0JICogSWYgbm90LCBjYWxsIHRoZSBvcmlnaW5hbCBoYW5kbGVyLgotCSAqLwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbXAubAklMCwyKCUlc3ApXG5cdCIKLQkJCSAgICAgICJiY3Mucwkub2xkX3ZlY3RvclxuXHQiCi0JCQkgICAgICAiY21wLmwJJTEsMiglJXNwKVxuXHQiCi0JCQkgICAgICAiYmxzLnMJLnNjc2lfYnVzZXJyXG4iCi0JCQkiLm9sZF92ZWN0b3I6XG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJJTIsLSglJXNwKVxuXHQiCi0JCQkgICAgICAicnRzXG4iCi0JCQkiLnNjc2lfYnVzZXJyOlxuXHQiCi0JCQkgICAgICA6Ci0JCQkgICAgICA6ICJpIiAoJiZzY3NpX2xvb3ApLCAiaSIgKCYmc2NzaV9lbmQpLAotCQkJICAgICAgICAibSIgKHNhdmVfYnVzZXJyKSApOwotCi0JaWYgKENQVV9JU18wNjApCi0JewotCQkvKgotCQkgKiBHZXQgZWZmZWN0aXZlIGFkZHJlc3MgYW5kIHJlc3RvcmUgdGhlIHN0YWNrLgotCQkgKi8KLQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmUubAk4KCUlc3ApLCUwXG5cdCIKLQkJCQkgICAgICAibW92ZS5sCSUxLCUlc3Bcblx0IgotCQkJCSAgICAgIDogIj1hJiIgKGVmZl9hZGRyKQotCQkJCSAgICAgIDogInIiIChzYXZlX3NwKSApOwotCX0KLQllbHNlCi0JewotCQlyZWdpc3RlciBzdHJ1Y3QgbTY4MDQwX2ZyYW1lICpmcmFtZTsKLQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxlYQk4KCUlc3ApLCUwXG5cdCIKLQkJCQkgICAgICA6ICI9YSYiIChmcmFtZSkgKTsKLQotCQlpZiAodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAxKQotCQl7Ci0JCQkvKgotCQkJICogQnVzIGVycm9yIHdoaWxlIHdyaXRpbmcuCi0JCQkgKi8KLQotCQkJaWYgKGZyYW1lLT53YjNzICYgV0JWXzA0MCkKLQkJCXsKLQkJCQlpZiAoZnJhbWUtPndiM2EgPT0gKGxvbmcpICZoYWRlc19wc2RtX3JlZykKLQkJCQkJc3RhcnRfYWRkci0tOwotCQkJCWVsc2UKLQkJCQkJd3JpdGViYWNrKGZyYW1lLT53YjNzLCBmcmFtZS0+d2IzYSwKLQkJCQkJCSAgZnJhbWUtPndiM2QsICYmc2NzaV9idXNfZXJyb3IpOwotCQkJfQotCi0JCQlpZiAoZnJhbWUtPndiMnMgJiBXQlZfMDQwKQotCQkJewotCQkJCWlmIChmcmFtZS0+d2IyYSA9PSAobG9uZykgJmhhZGVzX3BzZG1fcmVnKQotCQkJCQlzdGFydF9hZGRyLS07Ci0JCQkJZWxzZQotCQkJCQl3cml0ZWJhY2soZnJhbWUtPndiMnMsIGZyYW1lLT53YjJhLAotCQkJCQkJICBmcmFtZS0+d2IyZCwgJiZzY3NpX2J1c19lcnJvcik7Ci0JCQl9Ci0KLQkJCWlmIChmcmFtZS0+d2IxcyAmIFdCVl8wNDApCi0JCQl7Ci0JCQkJaWYgKGZyYW1lLT53YjFhID09IChsb25nKSAmaGFkZXNfcHNkbV9yZWcpCi0JCQkJCXN0YXJ0X2FkZHItLTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qCi0JCQkgKiBCdXMgZXJyb3Igd2hpbGUgcmVhZGluZy4KLQkJCSAqLwotCi0JCQlpZiAoZnJhbWUtPndiM3MgJiBXQlZfMDQwKQotCQkJCXdyaXRlYmFjayhmcmFtZS0+d2IzcywgZnJhbWUtPndiM2EsCi0JCQkJCSAgZnJhbWUtPndiM2QsICYmc2NzaV9idXNfZXJyb3IpOwotCQl9Ci0KLQkJZWZmX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBmcmFtZS0+ZmFkZHI7Ci0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlLmwJJTAsJSVzcFxuXHQiCi0JCQkJICAgICAgOgotCQkJCSAgICAgIDogInIiIChzYXZlX3NwKSApOwotCX0KLQotCWRtYV9jbnQgPSBlbmRfYWRkciAtIHN0YXJ0X2FkZHI7Ci0KLQlpZiAoZWZmX2FkZHIgPT0gJmhhZGVzX3BzZG1fcmVnKQotCXsKLQkJLyoKLQkJICogQnVzIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIHBzZXVkbwotCQkgKiBETUEgcmVnaXN0ZXIuIFRpbWUgb3V0LgotCQkgKi8KLQotCQl0cmllcy0tOwotCi0JCWlmICh0cmllcyA8PSAwKQotCQl7Ci0JCQlpZiAoKHR0X3Njc2lfZG1hLmRtYV9jdHJsICYgMSkgPT0gMCkJLyogUmVhZCBvciB3cml0ZT8gKi8KLQkJCQlzZXRfcmVzdGRhdGFfcmVnKHN0YXJ0X2FkZHIpOwotCi0JCQlpZiAoZG1hX2NudCA8PSAxKQotCQkJCXByaW50ayhLRVJOX0NSSVQgIkRNQSBlbXVsYXRpb246IEZhdGFsICIKLQkJCQkgICAgICAgImVycm9yIHdoaWxlICVzIHRoZSBsYXN0IGJ5dGUuXG4iLAotCQkJCSAgICAgICAodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAxKQotCQkJCSAgICAgICA/ICJ3cml0aW5nIiA6ICJyZWFkaW5nIik7Ci0KLQkJCWdvdG8gc2NzaV9lbmQ7Ci0JCX0KLQkJZWxzZQotCQkJZ290byBzY3NpX2xvb3A7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qCi0JCSAqIEJ1cyBlcnJvciBkdXJpbmcgcHNldWRvIERNQSB0cmFuc2Zlci4KLQkJICogVGVybWluYXRlIHRoZSBETUEgdHJhbnNmZXIuCi0JCSAqLwotCi0JCWhhZGVzX2RtYV9jdHJsIHw9IDM7CS8qIFNldCBFT1AgYW5kIGJ1cyBlcnJvci4gKi8KLQkJaWYgKCh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpID09IDApCS8qIFJlYWQgb3Igd3JpdGU/ICovCi0JCQlzZXRfcmVzdGRhdGFfcmVnKHN0YXJ0X2FkZHIpOwotCQlnb3RvIHNjc2lfZW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCmluZGV4IGY1NzMyZDguLjIxZmUwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYwpAQCAtMjQ5LDEwICsyNDksNiBAQAogbW9kdWxlX3BhcmFtKHNldHVwX2hvc3RpZCwgaW50LCAwKTsKIAogCi0jaWYgZGVmaW5lZChDT05GSUdfVFRfRE1BX0VNVUwpCi0jaW5jbHVkZSAiYXRhcmlfZG1hX2VtdWwuYyIKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChSRUFMX0RNQSkKIAogc3RhdGljIGludCBzY3NpX2RtYV9pc19pZ25vcmVkX2J1c2Vycih1bnNpZ25lZCBjaGFyIGRtYV9zdGF0KQpAQCAtNjk1LDIxICs2OTEsOCBAQAogI2lmZGVmIFJFQUxfRE1BCiAJCXR0X3Njc2lfZG1hLmRtYV9jdHJsID0gMDsKIAkJYXRhcmlfZG1hX3Jlc2lkdWFsID0gMDsKLSNpZmRlZiBDT05GSUdfVFRfRE1BX0VNVUwKLQkJaWYgKE1BQ0hfSVNfSEFERVMpIHsKLQkJCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT18yLCBoYWRlc19kbWFfZW11bGF0b3IsCi0JCQkJCSBJUlFfVFlQRV9QUklPLCAiSGFkZXMgRE1BIGVtdWxhdG9yIiwKLQkJCQkJIGhhZGVzX2RtYV9lbXVsYXRvcikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImF0YXJpX3Njc2lfZGV0ZWN0OiBjYW5ub3QgYWxsb2NhdGUgaXJxICVkLCBhYm9ydGluZyAoTUFDSF9JU19IQURFUykiLElSUV9BVVRPXzIpOwotCQkJCWZyZWVfaXJxKElSUV9UVF9NRlBfU0NTSSwgaW5zdGFuY2UpOwotCQkJCXNjc2lfdW5yZWdpc3RlcihhdGFyaV9zY3NpX2hvc3QpOwotCQkJCWF0YXJpX3N0cmFtX2ZyZWUoYXRhcmlfZG1hX2J1ZmZlcik7Ci0JCQkJYXRhcmlfZG1hX2J1ZmZlciA9IDA7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLSNlbmRpZgotCQlpZiAoTUFDSF9JU19NRURVU0EgfHwgTUFDSF9JU19IQURFUykgeworCisJCWlmIChNQUNIX0lTX01FRFVTQSkgewogCQkJLyogV2hpbGUgdGhlIHJlYWQgb3ZlcnJ1bnMgKGRlc2NyaWJlZCBieSBEcmV3IEVja2hhcmR0IGluCiAJCQkgKiBOQ1I1MzgwLmMpIG5ldmVyIGhhcHBlbmVkIG9uIFRUcywgdGhleSBkbyBpbiBmYWN0IG9uIHRoZSBNZWR1c2EKIAkJCSAqIChUaGlzIHdhcyB0aGUgY2F1c2Ugd2h5IFNDU0kgZGlkbid0IHdvcmsgcmlnaHQgZm9yIHNvIGxvbmcKQEAgLTEwMDcsMTEgKzk5MCw3IEBACiAJCQkJCVNjc2lfQ21uZCAqY21kLCBpbnQgd3JpdGVfZmxhZykKIHsKIAl1bnNpZ25lZCBsb25nCXBvc3NpYmxlX2xlbiwgbGltaXQ7Ci0jaWZuZGVmIENPTkZJR19UVF9ETUFfRU1VTAotCWlmIChNQUNIX0lTX0hBREVTKQotCQkvKiBIYWRlcyBoYXMgbm8gU0NTSSBETUEgYXQgYWxsIDotKCBBbHdheXMgZm9yY2UgdXNlIG9mIFBJTyAqLwotCQlyZXR1cm4gMDsKLSNlbmRpZgorCiAJaWYgKElTX0FfVFQoKSkKIAkJLyogVFQgU0NTSSBETUEgY2FuIHRyYW5zZmVyIGFyYml0cmFyeSAjYnl0ZXMgKi8KIAkJcmV0dXJuIHdhbnRlZF9sZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggZDQxMDRhM2IuLmQzY2E3ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTI5NjksNiArMjk2OSw5IEBACiAJCSIlZCBwb3J0cywgSVJRIHNoYXJpbmcgJXNhYmxlZFxuIiwgbnJfdWFydHMsCiAJCXNoYXJlX2lycXMgPyAiZW4iIDogImRpcyIpOwogCisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykKKwkJc3Bpbl9sb2NrX2luaXQoJmlycV9saXN0c1tpXS5sb2NrKTsKKwogI2lmZGVmIENPTkZJR19TUEFSQwogCXJldCA9IHN1bnNlcmlhbF9yZWdpc3Rlcl9taW5vcnMoJnNlcmlhbDgyNTBfcmVnLCBVQVJUX05SKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCmluZGV4IDljYmZmODQuLmRhOTFiYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCkBAIC0xODU1LDggKzE4NTUsNiBAQAogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcmVnaXN0ZXJlZF9mYltjb24yZmJfbWFwW3ZjLT52Y19udW1dXTsKIAlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwogCWludCBzY3JvbGxfcGFydGlhbCA9IGluZm8tPmZsYWdzICYgRkJJTkZPX1BBUlRJQUxfUEFOX09LOwotCXVuc2lnbmVkIHNob3J0IHNhdmVkX2VjOwotCWludCByZXQ7CiAKIAlpZiAoZmJjb25faXNfaW5hY3RpdmUodmMsIGluZm8pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4NjksMTEgKzE4NjcsNiBAQAogCSAqICAgICAgICAgICB3aG9sZSBzY3JlZW4gKHByZXZlbnRzIGZsaWNrZXIpLgogCSAqLwogCi0Jc2F2ZWRfZWMgPSB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhcjsKLQl2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA9IHZjLT52Y19zY3JsX2VyYXNlX2NoYXI7Ci0KLQlyZXQgPSAwOwotCiAJc3dpdGNoIChkaXIpIHsKIAljYXNlIFNNX1VQOgogCQlpZiAoY291bnQgPiB2Yy0+dmNfcm93cykJLyogTWF4aW11bSByZWFsaXN0aWMgc2l6ZSAqLwpAQCAtMTg5MCw5ICsxODgzLDkgQEAKIAkJCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKSAodmMtPnZjX29yaWdpbiArCiAJCQkJCQkJdmMtPnZjX3NpemVfcm93ICoKIAkJCQkJCQkoYiAtIGNvdW50KSksCi0JCQkJICAgIHZjLT52Y19zY3JsX2VyYXNlX2NoYXIsCisJCQkJICAgIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLAogCQkJCSAgICB2Yy0+dmNfc2l6ZV9yb3cgKiBjb3VudCk7Ci0JCQlyZXQgPSAxOworCQkJcmV0dXJuIDE7CiAJCQlicmVhazsKIAogCQljYXNlIFNDUk9MTF9XUkFQX01PVkU6CkBAIC0xOTYyLDEwICsxOTU1LDkgQEAKIAkJCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKSAodmMtPnZjX29yaWdpbiArCiAJCQkJCQkJdmMtPnZjX3NpemVfcm93ICoKIAkJCQkJCQkoYiAtIGNvdW50KSksCi0JCQkJICAgIHZjLT52Y19zY3JsX2VyYXNlX2NoYXIsCisJCQkJICAgIHZjLT52Y192aWRlb19lcmFzZV9jaGFyLAogCQkJCSAgICB2Yy0+dmNfc2l6ZV9yb3cgKiBjb3VudCk7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gMTsKIAkJfQogCQlicmVhazsKIApAQCAtMTk4Miw5ICsxOTc0LDkgQEAKIAkJCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKSAodmMtPnZjX29yaWdpbiArCiAJCQkJCQkJdmMtPnZjX3NpemVfcm93ICoKIAkJCQkJCQl0KSwKLQkJCQkgICAgdmMtPnZjX3NjcmxfZXJhc2VfY2hhciwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCiAJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKLQkJCXJldCA9IDE7CisJCQlyZXR1cm4gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NST0xMX1dSQVBfTU9WRToKQEAgLTIwNTIsMTUgKzIwNDQsMTIgQEAKIAkJCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKSAodmMtPnZjX29yaWdpbiArCiAJCQkJCQkJdmMtPnZjX3NpemVfcm93ICoKIAkJCQkJCQl0KSwKLQkJCQkgICAgdmMtPnZjX3NjcmxfZXJhc2VfY2hhciwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCiAJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKwkJCXJldHVybiAxOwogCQl9Ci0JCWJyZWFrOwogCX0KLQl2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA9IHNhdmVkX2VjOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjUyMiw5ICsyNTExLDYgQEAKIAkJCWMgPSB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhcjsKIAkJCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0KIAkJCSAgICAoKGMgJiAweGZlMDApID4+IDEpIHwgKGMgJiAweGZmKTsKLQkJCWMgPSB2Yy0+dmNfc2NybF9lcmFzZV9jaGFyOwotCQkJdmMtPnZjX3NjcmxfZXJhc2VfY2hhciA9Ci0JCQkgICAgKChjICYgMHhGRTAwKSA+PiAxKSB8IChjICYgMHhGRik7CiAJCQl2Yy0+dmNfYXR0ciA+Pj0gMTsKIAkJfQogCX0gZWxzZSBpZiAoIXZjLT52Y19oaV9mb250X21hc2sgJiYgY250ID09IDUxMikgewpAQCAtMjU1NSwxNCArMjU0MSw5IEBACiAJCQlpZiAodmMtPnZjX2Nhbl9kb19jb2xvcikgewogCQkJCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0KIAkJCQkgICAgKChjICYgMHhmZjAwKSA8PCAxKSB8IChjICYgMHhmZik7Ci0JCQkJYyA9IHZjLT52Y19zY3JsX2VyYXNlX2NoYXI7Ci0JCQkJdmMtPnZjX3NjcmxfZXJhc2VfY2hhciA9Ci0JCQkJICAgICgoYyAmIDB4RkYwMCkgPDwgMSkgfCAoYyAmIDB4RkYpOwogCQkJCXZjLT52Y19hdHRyIDw8PSAxOwotCQkJfSBlbHNlIHsKKwkJCX0gZWxzZQogCQkJCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0gYyAmIH4weDEwMDsKLQkJCQl2Yy0+dmNfc2NybF9lcmFzZV9jaGFyID0gYyAmIH4weDEwMDsKLQkJCX0KIAkJfQogCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL21kYWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL21kYWNvbi5jCmluZGV4IDk5MDEwNjQuLmRkM2VhYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9tZGFjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvbWRhY29uLmMKQEAgLTUzMyw3ICs1MzMsNyBAQAogCiBzdGF0aWMgaW50IG1kYWNvbl9zY3JvbGwoc3RydWN0IHZjX2RhdGEgKmMsIGludCB0LCBpbnQgYiwgaW50IGRpciwgaW50IGxpbmVzKQogewotCXUxNiBlYXR0ciA9IG1kYV9jb252ZXJ0X2F0dHIoYy0+dmNfc2NybF9lcmFzZV9jaGFyKTsKKwl1MTYgZWF0dHIgPSBtZGFfY29udmVydF9hdHRyKGMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIpOwogCiAJaWYgKCFsaW5lcykKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29uLmMKaW5kZXggNDA1NWRiZC4uNDkxYzFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL3N0aWNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb24uYwpAQCAtMTcwLDEyICsxNzAsMTIgQEAKICAgICBzd2l0Y2ggKGRpcikgewogICAgIGNhc2UgU01fVVA6CiAJc3RpX2Jtb3ZlKHN0aSwgdCArIGNvdW50LCAwLCB0LCAwLCBiIC0gdCAtIGNvdW50LCBjb25wLT52Y19jb2xzKTsKLQlzdGlfY2xlYXIoc3RpLCBiIC0gY291bnQsIDAsIGNvdW50LCBjb25wLT52Y19jb2xzLCBjb25wLT52Y19zY3JsX2VyYXNlX2NoYXIpOworCXN0aV9jbGVhcihzdGksIGIgLSBjb3VudCwgMCwgY291bnQsIGNvbnAtPnZjX2NvbHMsIGNvbnAtPnZjX3ZpZGVvX2VyYXNlX2NoYXIpOwogCWJyZWFrOwogCiAgICAgY2FzZSBTTV9ET1dOOgogCXN0aV9ibW92ZShzdGksIHQsIDAsIHQgKyBjb3VudCwgMCwgYiAtIHQgLSBjb3VudCwgY29ucC0+dmNfY29scyk7Ci0Jc3RpX2NsZWFyKHN0aSwgdCwgMCwgY291bnQsIGNvbnAtPnZjX2NvbHMsIGNvbnAtPnZjX3NjcmxfZXJhc2VfY2hhcik7CisJc3RpX2NsZWFyKHN0aSwgdCwgMCwgY291bnQsIGNvbnAtPnZjX2NvbHMsIGNvbnAtPnZjX3ZpZGVvX2VyYXNlX2NoYXIpOwogCWJyZWFrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCmluZGV4IGJkMWY1N2IuLjZkZjI5YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKQEAgLTEzNTAsNyArMTM1MCw3IEBACiAJCX0gZWxzZQogCQkJYy0+dmNfb3JpZ2luICs9IGRlbHRhOwogCQlzY3JfbWVtc2V0dygodTE2ICopIChjLT52Y19vcmlnaW4gKyBjLT52Y19zY3JlZW5idWZfc2l6ZSAtCi0JCQkJICAgICBkZWx0YSksIGMtPnZjX3NjcmxfZXJhc2VfY2hhciwKKwkJCQkgICAgIGRlbHRhKSwgYy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKIAkJCSAgICBkZWx0YSk7CiAJfSBlbHNlIHsKIAkJaWYgKG9sZG8gLSBkZWx0YSA8IHZnYV92cmFtX2Jhc2UpIHsKQEAgLTEzNjMsNyArMTM2Myw3IEBACiAJCX0gZWxzZQogCQkJYy0+dmNfb3JpZ2luIC09IGRlbHRhOwogCQljLT52Y19zY3JfZW5kID0gYy0+dmNfb3JpZ2luICsgYy0+dmNfc2NyZWVuYnVmX3NpemU7Ci0JCXNjcl9tZW1zZXR3KCh1MTYgKikgKGMtPnZjX29yaWdpbiksIGMtPnZjX3NjcmxfZXJhc2VfY2hhciwKKwkJc2NyX21lbXNldHcoKHUxNiAqKSAoYy0+dmNfb3JpZ2luKSwgYy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKIAkJCSAgICBkZWx0YSk7CiAJfQogCWMtPnZjX3Njcl9lbmQgPSBjLT52Y19vcmlnaW4gKyBjLT52Y19zY3JlZW5idWZfc2l6ZTsKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IGY1NGExNTcuLjllOWQ3MGMgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtMjIwLDE3ICsyMjAsMTYgQEAKIAl0cmlzdGF0ZQogCWhlbHAKIAkgIFRoaXMgaXMgYSBnZW5lcmljIGpvdXJuYWxsaW5nIGxheWVyIGZvciBibG9jayBkZXZpY2VzLiAgSXQgaXMKLQkgIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBleHQzIGFuZCBPQ0ZTMiBmaWxlIHN5c3RlbXMsIGJ1dCBpdCBjb3VsZAotCSAgYWxzbyBiZSB1c2VkIHRvIGFkZCBqb3VybmFsIHN1cHBvcnQgdG8gb3RoZXIgZmlsZSBzeXN0ZW1zIG9yIGJsb2NrCisJICBjdXJyZW50bHkgdXNlZCBieSB0aGUgZXh0MyBmaWxlIHN5c3RlbSwgYnV0IGl0IGNvdWxkIGFsc28gYmUKKwkgIHVzZWQgdG8gYWRkIGpvdXJuYWwgc3VwcG9ydCB0byBvdGhlciBmaWxlIHN5c3RlbXMgb3IgYmxvY2sKIAkgIGRldmljZXMgc3VjaCBhcyBSQUlEIG9yIExWTS4KIAotCSAgSWYgeW91IGFyZSB1c2luZyB0aGUgZXh0MyBvciBPQ0ZTMiBmaWxlIHN5c3RlbXMsIHlvdSBuZWVkIHRvCi0JICBzYXkgWSBoZXJlLiBJZiB5b3UgYXJlIG5vdCB1c2luZyBleHQzIE9DRlMyIHRoZW4geW91IHdpbGwgcHJvYmFibHkKLQkgIHdhbnQgdG8gc2F5IE4uCisJICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBleHQzIGZpbGUgc3lzdGVtLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlLgorCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgZXh0MyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkZXZpY2UgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIGpiZC4gIElmIHlvdSBhcmUgY29tcGlsaW5nIGV4dDMgb3IgT0NGUzIgaW50byB0aGUga2VybmVsLAotCSAgeW91IGNhbm5vdCBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZS4KKwkgIGNhbGxlZCBqYmQuICBJZiB5b3UgYXJlIGNvbXBpbGluZyBleHQzIGludG8gdGhlIGtlcm5lbCwgeW91CisJICBjYW5ub3QgY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUuCiAKIGNvbmZpZyBKQkRfREVCVUcKIAlib29sICJKQkQgKGV4dDMpIGRlYnVnZ2luZyBzdXBwb3J0IgpAQCAtMjU0LDE1ICsyNTMsMTYgQEAKIAloZWxwCiAJICBUaGlzIGlzIGEgZ2VuZXJpYyBqb3VybmFsaW5nIGxheWVyIGZvciBibG9jayBkZXZpY2VzIHRoYXQgc3VwcG9ydAogCSAgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBibG9jayBudW1iZXJzLiAgSXQgaXMgY3VycmVudGx5IHVzZWQgYnkKLQkgIHRoZSBleHQ0IGZpbGVzeXN0ZW0sIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gYWRkCisJICB0aGUgZXh0NCBhbmQgT0NGUzIgZmlsZXN5c3RlbXMsIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gYWRkCiAJICBqb3VybmFsIHN1cHBvcnQgdG8gb3RoZXIgZmlsZSBzeXN0ZW1zIG9yIGJsb2NrIGRldmljZXMgc3VjaAogCSAgYXMgUkFJRCBvciBMVk0uCiAKLQkgIElmIHlvdSBhcmUgdXNpbmcgZXh0NCwgeW91IG5lZWQgdG8gc2F5IFkgaGVyZS4gSWYgeW91IGFyZSBub3QKLQkgIHVzaW5nIGV4dDQgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHNheSBOLgorCSAgSWYgeW91IGFyZSB1c2luZyBleHQ0IG9yIE9DRlMyLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlLgorCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgZXh0NCBvciBPQ0ZTMiB0aGVuIHlvdSB3aWxsCisJICBwcm9iYWJseSB3YW50IHRvIHNheSBOLgogCiAJICBUbyBjb21waWxlIHRoaXMgZGV2aWNlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCBqYmQyLiAgSWYgeW91IGFyZSBjb21waWxpbmcgZXh0NCBpbnRvIHRoZSBrZXJuZWwsCisJICBjYWxsZWQgamJkMi4gIElmIHlvdSBhcmUgY29tcGlsaW5nIGV4dDQgb3IgT0NGUzIgaW50byB0aGUga2VybmVsLAogCSAgeW91IGNhbm5vdCBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZS4KIAogY29uZmlnIEpCRDJfREVCVUcKQEAgLTQzMyw2ICs0MzMsMTQgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBGSUxFX0xPQ0tJTkcKKwlib29sICJFbmFibGUgUE9TSVggZmlsZSBsb2NraW5nIEFQSSIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZAorICAgICAgICAgIGZvciBmaWxlc3lzdGVtcyBsaWtlIE5GUyBhbmQgZm9yIHRoZSBmbG9jaygpIHN5c3RlbQorICAgICAgICAgIGNhbGwuIERpc2FibGluZyB0aGlzIG9wdGlvbiBzYXZlcyBhYm91dCAxMWsuCisKIHNvdXJjZSAiZnMveGZzL0tjb25maWciCiBzb3VyY2UgImZzL2dmczIvS2NvbmZpZyIKIApAQCAtNDQwLDcgKzQ0OCw3IEBACiAJdHJpc3RhdGUgIk9DRlMyIGZpbGUgc3lzdGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVQgJiYgU1lTRlMKIAlzZWxlY3QgQ09ORklHRlNfRlMKLQlzZWxlY3QgSkJECisJc2VsZWN0IEpCRDIKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCiAJICBPQ0ZTMiBpcyBhIGdlbmVyYWwgcHVycG9zZSBleHRlbnQgYmFzZWQgc2hhcmVkIGRpc2sgY2x1c3RlciBmaWxlCkBAIC01MTEsNiArNTE5LDE2IEBACiAJICB0aGlzIG9wdGlvbiBmb3IgZGVidWdnaW5nIG9ubHkgYXMgaXQgaXMgbGlrZWx5IHRvIGRlY3JlYXNlCiAJICBwZXJmb3JtYW5jZSBvZiB0aGUgZmlsZXN5c3RlbS4KIAorY29uZmlnIE9DRlMyX0NPTVBBVF9KQkQKKwlib29sICJVc2UgSkJEIGZvciBjb21wYXRpYmlsaXR5IgorCWRlcGVuZHMgb24gT0NGUzJfRlMKKwlkZWZhdWx0IG4KKwlzZWxlY3QgSkJECisJaGVscAorCSAgVGhlIG9jZnMyIGZpbGVzeXN0ZW0gbm93IHVzZXMgSkJEMiBmb3IgaXRzIGpvdXJuYWxsaW5nLiAgSkJEMgorCSAgaXMgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBKQkQuICBJdCBpcyBzYWZlIHRvIHNheSBOIGhlcmUuCisJICBIb3dldmVyLCBpZiB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSBvcmlnaW5hbCBKQkQsIHNheSBZIGhlcmUuCisKIGVuZGlmICMgQkxPQ0sKIAogY29uZmlnIEROT1RJRlkKQEAgLTE3NzksNiArMTc5NywyOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU1VOUlBDX1JFR0lTVEVSX1Y0CisJYm9vbCAiUmVnaXN0ZXIgbG9jYWwgUlBDIHNlcnZpY2VzIHZpYSBycGNiaW5kIHY0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFN1biBhZGRlZCBzdXBwb3J0IGZvciByZWdpc3RlcmluZyBSUEMgc2VydmljZXMgYXQgYW4gSVB2NgorCSAgYWRkcmVzcyBieSBjcmVhdGluZyB0d28gbmV3IHZlcnNpb25zIG9mIHRoZSBycGNiaW5kIHByb3RvY29sCisJICAoUkZDIDE4MzMpLgorCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBSUEMgc2VydmVyIGZvcgorCSAgcmVnaXN0ZXJpbmcga2VybmVsIFJQQyBzZXJ2aWNlcyB2aWEgdmVyc2lvbiA0IG9mIHRoZSBycGNiaW5kCisJICBwcm90b2NvbC4gIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24sIHlvdSBtdXN0IHJ1biBhIHBvcnRtYXBwZXIKKwkgIGRhZW1vbiB0aGF0IHN1cHBvcnRzIHJwY2JpbmQgcHJvdG9jb2wgdmVyc2lvbiA0LgorCisJICBTZXJ2aW5nIE5GUyBvdmVyIElQdjYgZnJvbSBrbmZzZCAodGhlIGtlcm5lbCdzIE5GUyBzZXJ2ZXIpCisJICByZXF1aXJlcyB0aGF0IHlvdSBlbmFibGUgdGhpcyBvcHRpb24gYW5kIHVzZSBhIHBvcnRtYXBwZXIgdGhhdAorCSAgc3VwcG9ydHMgcnBjYmluZCB2ZXJzaW9uIDQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4gdG8gZ2V0IHRyYWRpdGlvbmFsIGJlaGF2aW9yIChyZWdpc3RlciBrZXJuZWwKKwkgIFJQQyBzZXJ2aWNlcyB1c2luZyBvbmx5IHJwY2JpbmQgdmVyc2lvbiAyKS4gIERpc3RyaWJ1dGlvbnMKKwkgIHVzaW5nIHRoZSBsZWdhY3kgTGludXggcG9ydG1hcHBlciBkYWVtb24gbXVzdCBzYXkgTiBoZXJlLgorCiBjb25maWcgUlBDU0VDX0dTU19LUkI1CiAJdHJpc3RhdGUgIlNlY3VyZSBSUEM6IEtlcmJlcm9zIFYgbWVjaGFuaXNtIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCBkZTQwNGIwLi5iNmYyN2RjIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtNyw3ICs3LDcgQEAKIAogb2JqLXkgOj0Jb3Blbi5vIHJlYWRfd3JpdGUubyBmaWxlX3RhYmxlLm8gc3VwZXIubyBcCiAJCWNoYXJfZGV2Lm8gc3RhdC5vIGV4ZWMubyBwaXBlLm8gbmFtZWkubyBmY250bC5vIFwKLQkJaW9jdGwubyByZWFkZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZGNhY2hlLm8gaW5vZGUubyBcCisJCWlvY3RsLm8gcmVhZGRpci5vIHNlbGVjdC5vIGZpZm8ubyBkY2FjaGUubyBpbm9kZS5vIFwKIAkJYXR0ci5vIGJhZF9pbm9kZS5vIGZpbGUubyBmaWxlc3lzdGVtcy5vIG5hbWVzcGFjZS5vIGFpby5vIFwKIAkJc2VxX2ZpbGUubyB4YXR0ci5vIGxpYmZzLm8gZnMtd3JpdGViYWNrLm8gXAogCQlwbm9kZS5vIGRyb3BfY2FjaGVzLm8gc3BsaWNlLm8gc3luYy5vIHV0aW1lcy5vIFwKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19TSUdOQUxGRCkJCSs9IHNpZ25hbGZkLm8KIG9iai0kKENPTkZJR19USU1FUkZEKQkJKz0gdGltZXJmZC5vCiBvYmotJChDT05GSUdfRVZFTlRGRCkJCSs9IGV2ZW50ZmQubworb2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICArPSBsb2Nrcy5vCiBvYmotJChDT05GSUdfQ09NUEFUKQkJKz0gY29tcGF0Lm8gY29tcGF0X2lvY3RsLm8KIAogbmZzZC0kKENPTkZJR19ORlNEKQkJOj0gbmZzY3RsLm8KZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL01ha2VmaWxlIGIvZnMvbG9ja2QvTWFrZWZpbGUKaW5kZXggNzcyNWEwYS4uOTdmNjA3MyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvTWFrZWZpbGUKKysrIGIvZnMvbG9ja2QvTWFrZWZpbGUKQEAgLTUsNiArNSw2IEBACiBvYmotJChDT05GSUdfTE9DS0QpICs9IGxvY2tkLm8KIAogbG9ja2Qtb2Jqcy15IDo9IGNsbnRsb2NrLm8gY2xudHByb2MubyBob3N0Lm8gc3ZjLm8gc3ZjbG9jay5vIHN2Y3NoYXJlLm8gXAotCSAgICAgICAgc3ZjcHJvYy5vIHN2Y3N1YnMubyBtb24ubyB4ZHIubworCSAgICAgICAgc3ZjcHJvYy5vIHN2Y3N1YnMubyBtb24ubyB4ZHIubyBncmFjZS5vCiBsb2NrZC1vYmpzLSQoQ09ORklHX0xPQ0tEX1Y0KSArPSB4ZHI0Lm8gc3ZjNHByb2MubwogbG9ja2Qtb2JqcwkJICAgICAgOj0gJChsb2NrZC1vYmpzLXkpCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50bG9jay5jIGIvZnMvbG9ja2QvY2xudGxvY2suYwppbmRleCAwYjQ1ZmQzLi44MzA3ZGQ2IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9jbG50bG9jay5jCisrKyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKQEAgLTU0LDE0ICs1NCwxMyBAQAogCXUzMiBubG1fdmVyc2lvbiA9IChubG1faW5pdC0+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+dmVycyAgPSAqcCsrOwotCWFyZ3AtPnByb3RvID0gKnArKzsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2suYyBiL2ZzL25mcy9jYWxsYmFjay5jCmluZGV4IGY0NDdmNGIuLjZhMDk3NjAgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFjay5jCisrKyBiL2ZzL25mcy9jYWxsYmFjay5jCkBAIC0xMDUsNyArMTA1LDggQEAKIAltdXRleF9sb2NrKCZuZnNfY2FsbGJhY2tfbXV0ZXgpOwogCWlmIChuZnNfY2FsbGJhY2tfaW5mby51c2VycysrIHx8IG5mc19jYWxsYmFja19pbmZvLnRhc2sgIT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0Jc2VydiA9IHN2Y19jcmVhdGUoJm5mczRfY2FsbGJhY2tfcHJvZ3JhbSwgTkZTNF9DQUxMQkFDS19CVUZTSVpFLCBOVUxMKTsKKwlzZXJ2ID0gc3ZjX2NyZWF0ZSgmbmZzNF9jYWxsYmFja19wcm9ncmFtLCBORlM0X0NBTExCQUNLX0JVRlNJWkUsCisJCQkJQUZfSU5FVCwgTlVMTCk7CiAJcmV0ID0gLUVOT01FTTsKIAlpZiAoIXNlcnYpCiAJCWdvdG8gb3V0X2VycjsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbG9ja2QuYyBiL2ZzL25mc2QvbG9ja2QuYwppbmRleCAxNWM2ZmFlLi5iMjc4NmE1IDEwMDY0NAotLS0gYS9mcy9uZnNkL2xvY2tkLmMKKysrIGIvZnMvbmZzZC9sb2NrZC5jCkBAIC03MCw3ICs3MCw2IEBACiBzdGF0aWMgc3RydWN0IG5sbXN2Y19iaW5kaW5nCW5mc2RfbmxtX29wcyA9IHsKIAkuZm9wZW4JCT0gbmxtX2ZvcGVuLAkJLyogb3BlbiBmaWxlIGZvciBsb2NraW5nICovCiAJLmZjbG9zZQkJPSBubG1fZmNsb3NlLAkJLyogY2xvc2UgZmlsZSAqLwotCS5nZXRfZ3JhY2VfcGVyaW9kID0gZ2V0X25mczRfZ3JhY2VfcGVyaW9kLAogfTsKIAogdm9pZApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnMzcHJvYy5jIGIvZnMvbmZzZC9uZnMzcHJvYy5jCmluZGV4IDRkNjE3ZWEuLjlkYmQyZWIgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzM3Byb2MuYworKysgYi9mcy9uZnNkL25mczNwcm9jLmMKQEAgLTYzLDcgKzYzLDggQEAKIAkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOwogCiAJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7Ci0JbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmcmVzcC0+ZmgsIDAsIE5GU0RfTUFZX05PUCk7CisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmcmVzcC0+ZmgsIDAsCisJCQlORlNEX01BWV9OT1AgfCBORlNEX01BWV9CWVBBU1NfR1NTX09OX1JPT1QpOwogCWlmIChuZnNlcnIpCiAJCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKIApAQCAtNTMwLDcgKzUzMSw3IEBACiAJZHByaW50aygibmZzZDogRlNTVEFUKDMpICAgJXNcbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOwogCi0JbmZzZXJyID0gbmZzZF9zdGF0ZnMocnFzdHAsICZhcmdwLT5maCwgJnJlc3AtPnN0YXRzKTsKKwluZnNlcnIgPSBuZnNkX3N0YXRmcyhycXN0cCwgJmFyZ3AtPmZoLCAmcmVzcC0+c3RhdHMsIDApOwogCWZoX3B1dCgmYXJncC0+ZmgpOwogCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKIH0KQEAgLTU1OCw3ICs1NTksOCBAQAogCXJlc3AtPmZfbWF4ZmlsZXNpemUgPSB+KHUzMikgMDsKIAlyZXNwLT5mX3Byb3BlcnRpZXMgPSBORlMzX0ZTRl9ERUZBVUxUOwogCi0JbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmYXJncC0+ZmgsIDAsIE5GU0RfTUFZX05PUCk7CisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmYXJncC0+ZmgsIDAsCisJCQlORlNEX01BWV9OT1AgfCBORlNEX01BWV9CWVBBU1NfR1NTX09OX1JPT1QpOwogCiAJLyogQ2hlY2sgc3BlY2lhbCBmZWF0dXJlcyBvZiB0aGUgZmlsZSBzeXN0ZW0uIE1heSByZXF1ZXN0CiAJICogZGlmZmVyZW50IHJlYWQvd3JpdGUgc2l6ZXMgZm9yIGZpbGUgc3lzdGVtcyBrbm93biB0byBoYXZlCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCA3MDJmYTU3Li4wOTQ3NDdhIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTIyNSw3ICsyMjUsOCBAQAogCiAJUkVTRVJWRV9TUEFDRSgxMitzaXplb2YoY2JfcmVjLT5jYnJfc3RhdGVpZCkgKyBsZW4pOwogCVdSSVRFMzIoT1BfQ0JfUkVDQUxMKTsKLQlXUklURU1FTSgmY2JfcmVjLT5jYnJfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCVdSSVRFMzIoY2JfcmVjLT5jYnJfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlXUklURU1FTSgmY2JfcmVjLT5jYnJfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CiAJV1JJVEUzMihjYl9yZWMtPmNicl90cnVuYyk7CiAJV1JJVEUzMihsZW4pOwogCVdSSVRFTUVNKGNiX3JlYy0+Y2JyX2ZodmFsLCBsZW4pOwpAQCAtMzc5LDYgKzM4MCw3IEBACiAJCS5hZGRyc2l6ZQk9IHNpemVvZihhZGRyKSwKIAkJLnRpbWVvdXQJPSAmdGltZXBhcm1zLAogCQkucHJvZ3JhbQk9ICZjYl9wcm9ncmFtLAorCQkucHJvZ251bWJlcgk9IGNiLT5jYl9wcm9nLAogCQkudmVyc2lvbgk9IG5mc19jYl92ZXJzaW9uWzFdLT5udW1iZXIsCiAJCS5hdXRoZmxhdm9yCT0gUlBDX0FVVEhfVU5JWCwgLyogWFhYOiBuZWVkIEFVVEhfR1NTLi4uICovCiAJCS5mbGFncwkJPSAoUlBDX0NMTlRfQ1JFQVRFX05PUElORyB8IFJQQ19DTE5UX0NSRUFURV9RVUlFVCksCkBAIC0zOTYsOSArMzk4LDYgQEAKIAlhZGRyLnNpbl9wb3J0ID0gaHRvbnMoY2ItPmNiX3BvcnQpOwogCWFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoY2ItPmNiX2FkZHIpOwogCi0JLyogSW5pdGlhbGl6ZSBycGNfc3RhdCAqLwotCW1lbXNldChhcmdzLnByb2dyYW0tPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHJwY19zdGF0KSk7Ci0KIAkvKiBDcmVhdGUgUlBDIGNsaWVudCAqLwogCWNsaWVudCA9IHJwY19jcmVhdGUoJmFyZ3MpOwogCWlmIChJU19FUlIoY2xpZW50KSkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cHJvYy5jIGIvZnMvbmZzZC9uZnM0cHJvYy5jCmluZGV4IGU1YjUxZmYuLjY2OTQ2MWUgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHByb2MuYworKysgYi9mcy9uZnNkL25mczRwcm9jLmMKQEAgLTIwMSwxMCArMjAxLDEwIEBACiAJLyogT3Blbm93bmVyIGlzIG5vdyBzZXQsIHNvIHNlcXVlbmNlIGlkIHdpbGwgZ2V0IGJ1bXBlZC4gIE5vdyB3ZSBuZWVkCiAJICogdGhlc2UgY2hlY2tzIGJlZm9yZSB3ZSBkbyBhbnkgY3JlYXRlczogKi8KIAlzdGF0dXMgPSBuZnNlcnJfZ3JhY2U7Ci0JaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKIAkJZ290byBvdXQ7CiAJc3RhdHVzID0gbmZzZXJyX25vX2dyYWNlOwotCWlmICghbmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQorCWlmICghbG9ja3NfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKQEAgLTU3NSw3ICs1NzUsNyBAQAogewogCV9fYmUzMiBzdGF0dXM7CiAKLQlpZiAobmZzNF9pbl9ncmFjZSgpKQorCWlmIChsb2Nrc19pbl9ncmFjZSgpKQogCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwogCXN0YXR1cyA9IG5mc2RfdW5saW5rKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLCAwLAogCQkJICAgICByZW1vdmUtPnJtX25hbWUsIHJlbW92ZS0+cm1fbmFtZWxlbik7CkBAIC01OTYsNyArNTk2LDcgQEAKIAogCWlmICghY3N0YXRlLT5zYXZlX2ZoLmZoX2RlbnRyeSkKIAkJcmV0dXJuIHN0YXR1czsKLQlpZiAobmZzNF9pbl9ncmFjZSgpICYmICEoY3N0YXRlLT5zYXZlX2ZoLmZoX2V4cG9ydC0+ZXhfZmxhZ3MKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSAmJiAhKGNzdGF0ZS0+c2F2ZV9maC5maF9leHBvcnQtPmV4X2ZsYWdzCiAJCQkJCSYgTkZTRVhQX05PU1VCVFJFRUNIRUNLKSkKIAkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKIAlzdGF0dXMgPSBuZnNkX3JlbmFtZShycXN0cCwgJmNzdGF0ZS0+c2F2ZV9maCwgcmVuYW1lLT5ybl9zbmFtZSwKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCmluZGV4IDE1NzhkN2EuLjBjYzdmZjUgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtNjEsNyArNjEsNiBAQAogc3RhdGljIHRpbWVfdCBsZWFzZV90aW1lID0gOTA7ICAgICAvKiBkZWZhdWx0IGxlYXNlIHRpbWUgKi8KIHN0YXRpYyB0aW1lX3QgdXNlcl9sZWFzZV90aW1lID0gOTA7CiBzdGF0aWMgdGltZV90IGJvb3RfdGltZTsKLXN0YXRpYyBpbnQgaW5fZ3JhY2UgPSAxOwogc3RhdGljIHUzMiBjdXJyZW50X293bmVyaWQgPSAxOwogc3RhdGljIHUzMiBjdXJyZW50X2ZpbGVpZCA9IDE7CiBzdGF0aWMgdTMyIGN1cnJlbnRfZGVsZWdpZCA9IDE7CkBAIC0xNjQwLDcgKzE2MzksNyBAQAogCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgogCQkJLyogTGV0J3Mgbm90IGdpdmUgb3V0IGFueSBkZWxlZ2F0aW9ucyB0aWxsIGV2ZXJ5b25lJ3MKIAkJCSAqIGhhZCB0aGUgY2hhbmNlIHRvIHJlY2xhaW0gdGhlaXJzLi4uLiAqLwotCQkJaWYgKG5mczRfaW5fZ3JhY2UoKSkKKwkJCWlmIChsb2Nrc19pbl9ncmFjZSgpKQogCQkJCWdvdG8gb3V0OwogCQkJaWYgKCFhdG9taWNfcmVhZCgmY2ItPmNiX3NldCkgfHwgIXNvcC0+c29fY29uZmlybWVkKQogCQkJCWdvdG8gb3V0OwpAQCAtMTgxNiwxMiArMTgxNSwxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0cnVjdCBsb2NrX21hbmFnZXIgbmZzZDRfbWFuYWdlciA9IHsKK307CisKIHN0YXRpYyB2b2lkCi1lbmRfZ3JhY2Uodm9pZCkKK25mc2Q0X2VuZF9ncmFjZSh2b2lkKQogewogCWRwcmludGsoIk5GU0Q6IGVuZCBvZiBncmFjZSBwZXJpb2RcbiIpOwogCW5mc2Q0X3JlY2Rpcl9wdXJnZV9vbGQoKTsKLQlpbl9ncmFjZSA9IDA7CisJbG9ja3NfZW5kX2dyYWNlKCZuZnNkNF9tYW5hZ2VyKTsKIH0KIAogc3RhdGljIHRpbWVfdApAQCAtMTgzOCw4ICsxODQwLDggQEAKIAluZnM0X2xvY2tfc3RhdGUoKTsKIAogCWRwcmludGsoIk5GU0Q6IGxhdW5kcm9tYXQgc2VydmljZSAtIHN0YXJ0aW5nXG4iKTsKLQlpZiAoaW5fZ3JhY2UpCi0JCWVuZF9ncmFjZSgpOworCWlmIChsb2Nrc19pbl9ncmFjZSgpKQorCQluZnNkNF9lbmRfZ3JhY2UoKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmY2xpZW50X2xydSkgewogCQljbHAgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG5mczRfY2xpZW50LCBjbF9scnUpOwogCQlpZiAodGltZV9hZnRlcigodW5zaWduZWQgbG9uZyljbHAtPmNsX3RpbWUsICh1bnNpZ25lZCBsb25nKWN1dG9mZikpIHsKQEAgLTE5NzQsNyArMTk3Niw3IEBACiAJCXJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CiAJZWxzZSBpZiAoT05FX1NUQVRFSUQoc3RhdGVpZCkgJiYgKGZsYWdzICYgUkRfU1RBVEUpKQogCQlyZXR1cm4gbmZzX29rOwotCWVsc2UgaWYgKG5mczRfaW5fZ3JhY2UoKSkgeworCWVsc2UgaWYgKGxvY2tzX2luX2dyYWNlKCkpIHsKIAkJLyogQW5zd2VyIGluIHJlbWFpbmluZyBjYXNlcyBkZXBlbmRzIG9uIGV4aXN0YW5jZSBvZgogCQkgKiBjb25mbGljdGluZyBzdGF0ZTsgc28gd2UgbXVzdCB3YWl0IG91dCB0aGUgZ3JhY2UgcGVyaW9kLiAqLwogCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwpAQCAtMTk5Myw3ICsxOTk1LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBpb19kdXJpbmdfZ3JhY2VfZGlzYWxsb3dlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCiB7Ci0JcmV0dXJuIG5mczRfaW5fZ3JhY2UoKSAmJiAoZmxhZ3MgJiAoUkRfU1RBVEUgfCBXUl9TVEFURSkpCisJcmV0dXJuIGxvY2tzX2luX2dyYWNlKCkgJiYgKGZsYWdzICYgKFJEX1NUQVRFIHwgV1JfU1RBVEUpKQogCQkmJiBtYW5kYXRvcnlfbG9jayhpbm9kZSk7CiB9CiAKQEAgLTI2OTMsMTAgKzI2OTUsMTAgQEAKIAlmaWxwID0gbG9ja19zdHAtPnN0X3Zmc19maWxlOwogCiAJc3RhdHVzID0gbmZzZXJyX2dyYWNlOwotCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgIWxvY2stPmxrX3JlY2xhaW0pCisJaWYgKGxvY2tzX2luX2dyYWNlKCkgJiYgIWxvY2stPmxrX3JlY2xhaW0pCiAJCWdvdG8gb3V0OwogCXN0YXR1cyA9IG5mc2Vycl9ub19ncmFjZTsKLQlpZiAoIW5mczRfaW5fZ3JhY2UoKSAmJiBsb2NrLT5sa19yZWNsYWltKQorCWlmICghbG9ja3NfaW5fZ3JhY2UoKSAmJiBsb2NrLT5sa19yZWNsYWltKQogCQlnb3RvIG91dDsKIAogCWxvY2tzX2luaXRfbG9jaygmZmlsZV9sb2NrKTsKQEAgLTI3NzksNyArMjc4MSw3IEBACiAJaW50IGVycm9yOwogCV9fYmUzMiBzdGF0dXM7CiAKLQlpZiAobmZzNF9pbl9ncmFjZSgpKQorCWlmIChsb2Nrc19pbl9ncmFjZSgpKQogCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwogCiAJaWYgKGNoZWNrX2xvY2tfbGVuZ3RoKGxvY2t0LT5sdF9vZmZzZXQsIGxvY2t0LT5sdF9sZW5ndGgpKQpAQCAtMzE5Miw5ICszMTk0LDkgQEAKIAl1bnNpZ25lZCBsb25nIGdyYWNlX3RpbWU7CiAKIAlib290X3RpbWUgPSBnZXRfc2Vjb25kcygpOwotCWdyYWNlX3RpbWUgPSBnZXRfbmZzX2dyYWNlX3BlcmlvZCgpOworCWdyYWNlX3RpbWUgPSBnZXRfbmZzNF9ncmFjZV9wZXJpb2QoKTsKIAlsZWFzZV90aW1lID0gdXNlcl9sZWFzZV90aW1lOwotCWluX2dyYWNlID0gMTsKKwlsb2Nrc19zdGFydF9ncmFjZSgmbmZzZDRfbWFuYWdlcik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiTkZTRDogc3RhcnRpbmcgJWxkLXNlY29uZCBncmFjZSBwZXJpb2RcbiIsCiAJICAgICAgIGdyYWNlX3RpbWUvSFopOwogCWxhdW5kcnlfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibmZzZDQiKTsKQEAgLTMyMTMsMTIgKzMyMTUsNiBAQAogCXJldHVybjsKIH0KIAotaW50Ci1uZnM0X2luX2dyYWNlKHZvaWQpCi17Ci0JcmV0dXJuIGluX2dyYWNlOwotfQotCiB0aW1lX3QKIG5mczRfbGVhc2VfdGltZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCAxNGJhNGQ5Li5hZmNkZjRiIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtNDEzLDYgKzQxMywxOCBAQAogfQogCiBzdGF0aWMgX19iZTMyCituZnNkNF9kZWNvZGVfc3RhdGVpZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdGF0ZWlkX3QgKnNpZCkKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEMzIoc2lkLT5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZzaWQtPnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfYWNjZXNzKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9hY2Nlc3MgKmFjY2VzcykKIHsKIAlERUNPREVfSEVBRDsKQEAgLTQyOSwxMCArNDQxLDkgQEAKIAlERUNPREVfSEVBRDsKIAogCWNsb3NlLT5jbF9zdGF0ZW93bmVyID0gTlVMTDsKLQlSRUFEX0JVRig0ICsgc2l6ZW9mKHN0YXRlaWRfdCkpOworCVJFQURfQlVGKDQpOwogCVJFQUQzMihjbG9zZS0+Y2xfc2VxaWQpOwotCVJFQUQzMihjbG9zZS0+Y2xfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQlDT1BZTUVNKCZjbG9zZS0+Y2xfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJcmV0dXJuIG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZjbG9zZS0+Y2xfc3RhdGVpZCk7CiAKIAlERUNPREVfVEFJTDsKIH0KQEAgLTQ5MywxMyArNTA0LDcgQEAKIHN0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9kZWNvZGVfZGVsZWdyZXR1cm4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2RlbGVncmV0dXJuICpkcikKIHsKLQlERUNPREVfSEVBRDsKLQotCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpKTsKLQlSRUFEMzIoZHItPmRyX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JQ09QWU1FTSgmZHItPmRyX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOwotCi0JREVDT0RFX1RBSUw7CisJcmV0dXJuIG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZkci0+ZHJfc3RhdGVpZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX19iZTMyCkBAIC01NDIsMjAgKzU0NywyMiBAQAogCVJFQUQzMihsb2NrLT5sa19pc19uZXcpOwogCiAJaWYgKGxvY2stPmxrX2lzX25ldykgewotCQlSRUFEX0JVRigzNik7CisJCVJFQURfQlVGKDQpOwogCQlSRUFEMzIobG9jay0+bGtfbmV3X29wZW5fc2VxaWQpOwotCQlSRUFEMzIobG9jay0+bGtfbmV3X29wZW5fc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQotCQlDT1BZTUVNKCZsb2NrLT5sa19uZXdfb3Blbl9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwkJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJmxvY2stPmxrX25ld19vcGVuX3N0YXRlaWQpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJUkVBRF9CVUYoOCArIHNpemVvZihjbGllbnRpZF90KSk7CiAJCVJFQUQzMihsb2NrLT5sa19uZXdfbG9ja19zZXFpZCk7CiAJCUNPUFlNRU0oJmxvY2stPmxrX25ld19jbGllbnRpZCwgc2l6ZW9mKGNsaWVudGlkX3QpKTsKIAkJUkVBRDMyKGxvY2stPmxrX25ld19vd25lci5sZW4pOwogCQlSRUFEX0JVRihsb2NrLT5sa19uZXdfb3duZXIubGVuKTsKIAkJUkVBRE1FTShsb2NrLT5sa19uZXdfb3duZXIuZGF0YSwgbG9jay0+bGtfbmV3X293bmVyLmxlbik7CiAJfSBlbHNlIHsKLQkJUkVBRF9CVUYoMjApOwotCQlSRUFEMzIobG9jay0+bGtfb2xkX2xvY2tfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQkJQ09QWU1FTSgmbG9jay0+bGtfb2xkX2xvY2tfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZsb2NrLT5sa19vbGRfbG9ja19zdGF0ZWlkKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJCVJFQURfQlVGKDQpOwogCQlSRUFEMzIobG9jay0+bGtfb2xkX2xvY2tfc2VxaWQpOwogCX0KIApAQCAtNTg3LDEzICs1OTQsMTUgQEAKIAlERUNPREVfSEVBRDsKIAogCWxvY2t1LT5sdV9zdGF0ZW93bmVyID0gTlVMTDsKLQlSRUFEX0JVRigyNCArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEX0JVRig4KTsKIAlSRUFEMzIobG9ja3UtPmx1X3R5cGUpOwogCWlmICgobG9ja3UtPmx1X3R5cGUgPCBORlM0X1JFQURfTFQpIHx8IChsb2NrdS0+bHVfdHlwZSA+IE5GUzRfV1JJVEVXX0xUKSkKIAkJZ290byB4ZHJfZXJyb3I7CiAJUkVBRDMyKGxvY2t1LT5sdV9zZXFpZCk7Ci0JUkVBRDMyKGxvY2t1LT5sdV9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOwotCUNPUFlNRU0oJmxvY2t1LT5sdV9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlzdGF0dXMgPSBuZnNkNF9kZWNvZGVfc3RhdGVpZChhcmdwLCAmbG9ja3UtPmx1X3N0YXRlaWQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoMTYpOwogCVJFQUQ2NChsb2NrdS0+bHVfb2Zmc2V0KTsKIAlSRUFENjQobG9ja3UtPmx1X2xlbmd0aCk7CiAKQEAgLTY3OCw4ICs2ODcsMTAgQEAKIAkJUkVBRDMyKG9wZW4tPm9wX2RlbGVnYXRlX3R5cGUpOwogCQlicmVhazsKIAljYXNlIE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVI6Ci0JCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpICsgNCk7Ci0JCUNPUFlNRU0oJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJUkVBRF9CVUYoNCk7CiAJCVJFQUQzMihvcGVuLT5vcF9mbmFtZS5sZW4pOwogCQlSRUFEX0JVRihvcGVuLT5vcF9mbmFtZS5sZW4pOwogCQlTQVZFTUVNKG9wZW4tPm9wX2ZuYW1lLmRhdGEsIG9wZW4tPm9wX2ZuYW1lLmxlbik7CkBAIC02OTksOSArNzEwLDEwIEBACiAJREVDT0RFX0hFQUQ7CiAJCSAgICAKIAlvcGVuX2NvbmYtPm9jX3N0YXRlb3duZXIgPSBOVUxMOwotCVJFQURfQlVGKDQgKyBzaXplb2Yoc3RhdGVpZF90KSk7Ci0JUkVBRDMyKG9wZW5fY29uZi0+b2NfcmVxX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JQ09QWU1FTSgmb3Blbl9jb25mLT5vY19yZXFfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJm9wZW5fY29uZi0+b2NfcmVxX3N0YXRlaWQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoNCk7CiAJUkVBRDMyKG9wZW5fY29uZi0+b2Nfc2VxaWQpOwogCQkJCQkJICAgICAgICAKIAlERUNPREVfVEFJTDsKQEAgLTcxMyw5ICs3MjUsMTAgQEAKIAlERUNPREVfSEVBRDsKIAkJICAgIAogCW9wZW5fZG93bi0+b2Rfc3RhdGVvd25lciA9IE5VTEw7Ci0JUkVBRF9CVUYoMTIgKyBzaXplb2Yoc3RhdGVpZF90KSk7Ci0JUkVBRDMyKG9wZW5fZG93bi0+b2Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQlDT1BZTUVNKCZvcGVuX2Rvd24tPm9kX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZvcGVuX2Rvd24tPm9kX3N0YXRlaWQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoMTIpOwogCVJFQUQzMihvcGVuX2Rvd24tPm9kX3NlcWlkKTsKIAlSRUFEMzIob3Blbl9kb3duLT5vZF9zaGFyZV9hY2Nlc3MpOwogCVJFQUQzMihvcGVuX2Rvd24tPm9kX3NoYXJlX2RlbnkpOwpAQCAtNzQzLDkgKzc1NiwxMCBAQAogewogCURFQ09ERV9IRUFEOwogCi0JUkVBRF9CVUYoc2l6ZW9mKHN0YXRlaWRfdCkgKyAxMik7Ci0JUkVBRDMyKHJlYWQtPnJkX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JQ09QWU1FTSgmcmVhZC0+cmRfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJnJlYWQtPnJkX3N0YXRlaWQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoMTIpOwogCVJFQUQ2NChyZWFkLT5yZF9vZmZzZXQpOwogCVJFQUQzMihyZWFkLT5yZF9sZW5ndGgpOwogCkBAIC04MzQsMTUgKzg0OCwxMyBAQAogc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3NldGF0dHIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCiB7Ci0JREVDT0RFX0hFQUQ7CisJX19iZTMyIHN0YXR1czsKIAotCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpKTsKLQlSRUFEMzIoc2V0YXR0ci0+c2Ffc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQlDT1BZTUVNKCZzZXRhdHRyLT5zYV9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKLQlpZiAoKHN0YXR1cyA9IG5mc2Q0X2RlY29kZV9mYXR0cihhcmdwLCBzZXRhdHRyLT5zYV9ibXZhbCwgJnNldGF0dHItPnNhX2lhdHRyLCAmc2V0YXR0ci0+c2FfYWNsKSkpCi0JCWdvdG8gb3V0OwotCi0JREVDT0RFX1RBSUw7CisJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJnNldGF0dHItPnNhX3N0YXRlaWQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIG5mc2Q0X2RlY29kZV9mYXR0cihhcmdwLCBzZXRhdHRyLT5zYV9ibXZhbCwKKwkJCQkgICZzZXRhdHRyLT5zYV9pYXR0ciwgJnNldGF0dHItPnNhX2FjbCk7CiB9CiAKIHN0YXRpYyBfX2JlMzIKQEAgLTkyNyw5ICs5MzksMTAgQEAKIAlpbnQgbGVuOwogCURFQ09ERV9IRUFEOwogCi0JUkVBRF9CVUYoc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpICsgMjApOwotCVJFQUQzMih3cml0ZS0+d3Jfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQlDT1BZTUVNKCZ3cml0ZS0+d3Jfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJndyaXRlLT53cl9zdGF0ZWlkKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDE2KTsKIAlSRUFENjQod3JpdGUtPndyX29mZnNldCk7CiAJUkVBRDMyKHdyaXRlLT53cl9zdGFibGVfaG93KTsKIAlpZiAod3JpdGUtPndyX3N0YWJsZV9ob3cgPiAyKQpAQCAtMTE4Myw3ICsxMTk2LDYgQEAKICAqIEhlYWRlciByb3V0aW5lIHRvIHNldHVwIHNlcWlkIG9wZXJhdGlvbiByZXBsYXkgY2FjaGUKICAqLwogI2RlZmluZSBFTkNPREVfU0VRSURfT1BfSEVBRAkJCQkJXAotCV9fYmUzMiAqcDsJCQkJCQlcCiAJX19iZTMyICpzYXZlOwkJCQkJCVwKIAkJCQkJCQkJXAogCXNhdmUgPSByZXNwLT5wOwpAQCAtMTk1MCw2ICsxOTYyLDE3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfc3RhdGVpZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIHN0YXRlaWRfdCAqc2lkKQoreworCUVOQ09ERV9IRUFEOworCisJUkVTRVJWRV9TUEFDRShzaXplb2Yoc3RhdGVpZF90KSk7CisJV1JJVEUzMihzaWQtPnNpX2dlbmVyYXRpb24pOworCVdSSVRFTUVNKCZzaWQtPnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlBREpVU1RfQVJHUygpOworfQorCiBzdGF0aWMgX19iZTMyCiBuZnNkNF9lbmNvZGVfYWNjZXNzKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X2FjY2VzcyAqYWNjZXNzKQogewpAQCAtMTk2OSwxMiArMTk5Miw5IEBACiB7CiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CiAKLQlpZiAoIW5mc2VycikgewotCQlSRVNFUlZFX1NQQUNFKHNpemVvZihzdGF0ZWlkX3QpKTsKLQkJV1JJVEUzMihjbG9zZS0+Y2xfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQkJV1JJVEVNRU0oJmNsb3NlLT5jbF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKLQkJQURKVVNUX0FSR1MoKTsKLQl9CisJaWYgKCFuZnNlcnIpCisJCW5mc2Q0X2VuY29kZV9zdGF0ZWlkKHJlc3AsICZjbG9zZS0+Y2xfc3RhdGVpZCk7CisKIAlFTkNPREVfU0VRSURfT1BfVEFJTChjbG9zZS0+Y2xfc3RhdGVvd25lcik7CiAJcmV0dXJuIG5mc2VycjsKIH0KQEAgLTIwNzQsMTIgKzIwOTQsOSBAQAogewogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwogCi0JaWYgKCFuZnNlcnIpIHsKLQkJUkVTRVJWRV9TUEFDRSg0ICsgc2l6ZW9mKHN0YXRlaWRfdCkpOwotCQlXUklURTMyKGxvY2stPmxrX3Jlc3Bfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQkJV1JJVEVNRU0oJmxvY2stPmxrX3Jlc3Bfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7Ci0JCUFESlVTVF9BUkdTKCk7Ci0JfSBlbHNlIGlmIChuZnNlcnIgPT0gbmZzZXJyX2RlbmllZCkKKwlpZiAoIW5mc2VycikKKwkJbmZzZDRfZW5jb2RlX3N0YXRlaWQocmVzcCwgJmxvY2stPmxrX3Jlc3Bfc3RhdGVpZCk7CisJZWxzZSBpZiAobmZzZXJyID09IG5mc2Vycl9kZW5pZWQpCiAJCW5mc2Q0X2VuY29kZV9sb2NrX2RlbmllZChyZXNwLCAmbG9jay0+bGtfZGVuaWVkKTsKIAogCUVOQ09ERV9TRVFJRF9PUF9UQUlMKGxvY2stPmxrX3JlcGxheV9vd25lcik7CkBAIC0yMDk5LDEzICsyMTE2LDkgQEAKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIAotCWlmICghbmZzZXJyKSB7Ci0JCVJFU0VSVkVfU1BBQ0Uoc2l6ZW9mKHN0YXRlaWRfdCkpOwotCQlXUklURTMyKGxvY2t1LT5sdV9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOwotCQlXUklURU1FTSgmbG9ja3UtPmx1X3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOwotCQlBREpVU1RfQVJHUygpOwotCX0KLQkJCQkgICAgICAgIAorCWlmICghbmZzZXJyKQorCQluZnNkNF9lbmNvZGVfc3RhdGVpZChyZXNwLCAmbG9ja3UtPmx1X3N0YXRlaWQpOworCiAJRU5DT0RFX1NFUUlEX09QX1RBSUwobG9ja3UtPmx1X3N0YXRlb3duZXIpOwogCXJldHVybiBuZnNlcnI7CiB9CkBAIC0yMTI4LDE0ICsyMTQxLDE0IEBACiBzdGF0aWMgX19iZTMyCiBuZnNkNF9lbmNvZGVfb3BlbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogeworCUVOQ09ERV9IRUFEOwogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwogCiAJaWYgKG5mc2VycikKIAkJZ290byBvdXQ7CiAKLQlSRVNFUlZFX1NQQUNFKDM2ICsgc2l6ZW9mKHN0YXRlaWRfdCkpOwotCVdSSVRFMzIob3Blbi0+b3Bfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQlXUklURU1FTSgmb3Blbi0+b3Bfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJbmZzZDRfZW5jb2RlX3N0YXRlaWQocmVzcCwgJm9wZW4tPm9wX3N0YXRlaWQpOworCVJFU0VSVkVfU1BBQ0UoNDApOwogCVdSSVRFQ0lORk8ob3Blbi0+b3BfY2luZm8pOwogCVdSSVRFMzIob3Blbi0+b3BfcmZsYWdzKTsKIAlXUklURTMyKDIpOwpAQCAtMjE0OCw4ICsyMTYxLDggQEAKIAljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9OT05FOgogCQlicmVhazsKIAljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEOgotCQlSRVNFUlZFX1NQQUNFKDIwICsgc2l6ZW9mKHN0YXRlaWRfdCkpOwotCQlXUklURU1FTSgmb3Blbi0+b3BfZGVsZWdhdGVfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCQluZnNkNF9lbmNvZGVfc3RhdGVpZChyZXNwLCAmb3Blbi0+b3BfZGVsZWdhdGVfc3RhdGVpZCk7CisJCVJFU0VSVkVfU1BBQ0UoMjApOwogCQlXUklURTMyKG9wZW4tPm9wX3JlY2FsbCk7CiAKIAkJLyoKQEAgLTIxNjIsOCArMjE3NSw4IEBACiAJCUFESlVTVF9BUkdTKCk7CiAJCWJyZWFrOwogCWNhc2UgTkZTNF9PUEVOX0RFTEVHQVRFX1dSSVRFOgotCQlSRVNFUlZFX1NQQUNFKDMyICsgc2l6ZW9mKHN0YXRlaWRfdCkpOwotCQlXUklURU1FTSgmb3Blbi0+b3BfZGVsZWdhdGVfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCQluZnNkNF9lbmNvZGVfc3RhdGVpZChyZXNwLCAmb3Blbi0+b3BfZGVsZWdhdGVfc3RhdGVpZCk7CisJCVJFU0VSVkVfU1BBQ0UoMzIpOwogCQlXUklURTMyKDApOwogCiAJCS8qCkBAIC0yMTk1LDEzICsyMjA4LDkgQEAKIG5mc2Q0X2VuY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3Blbl9jb25maXJtICpvYykKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKLQkJCQkgICAgICAgIAotCWlmICghbmZzZXJyKSB7Ci0JCVJFU0VSVkVfU1BBQ0Uoc2l6ZW9mKHN0YXRlaWRfdCkpOwotCQlXUklURTMyKG9jLT5vY19yZXNwX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JCVdSSVRFTUVNKCZvYy0+b2NfcmVzcF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKLQkJQURKVVNUX0FSR1MoKTsKLQl9CisKKwlpZiAoIW5mc2VycikKKwkJbmZzZDRfZW5jb2RlX3N0YXRlaWQocmVzcCwgJm9jLT5vY19yZXNwX3N0YXRlaWQpOwogCiAJRU5DT0RFX1NFUUlEX09QX1RBSUwob2MtPm9jX3N0YXRlb3duZXIpOwogCXJldHVybiBuZnNlcnI7CkBAIC0yMjExLDEzICsyMjIwLDkgQEAKIG5mc2Q0X2VuY29kZV9vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuX2Rvd25ncmFkZSAqb2QpCiB7CiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7Ci0JCQkJICAgICAgICAKLQlpZiAoIW5mc2VycikgewotCQlSRVNFUlZFX1NQQUNFKHNpemVvZihzdGF0ZWlkX3QpKTsKLQkJV1JJVEUzMihvZC0+b2Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQkJV1JJVEVNRU0oJm9kLT5vZF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKLQkJQURKVVNUX0FSR1MoKTsKLQl9CisKKwlpZiAoIW5mc2VycikKKwkJbmZzZDRfZW5jb2RlX3N0YXRlaWQocmVzcCwgJm9kLT5vZF9zdGF0ZWlkKTsKIAogCUVOQ09ERV9TRVFJRF9PUF9UQUlMKG9kLT5vZF9zdGF0ZW93bmVyKTsKIAlyZXR1cm4gbmZzZXJyOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggYzUzZTY1Zi4uOTc1NDNkZiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC02MTQsMTAgKzYxNCw5IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJZXJyID0gbmZzZF9jcmVhdGVfc2VydigpOwogCQlpZiAoIWVycikgewotCQkJaW50IHByb3RvID0gMDsKLQkJCWVyciA9IHN2Y19hZGRzb2NrKG5mc2Rfc2VydiwgZmQsIGJ1ZiwgJnByb3RvKTsKKwkJCWVyciA9IHN2Y19hZGRzb2NrKG5mc2Rfc2VydiwgZmQsIGJ1Zik7CiAJCQlpZiAoZXJyID49IDApIHsKLQkJCQllcnIgPSBsb2NrZF91cChwcm90byk7CisJCQkJZXJyID0gbG9ja2RfdXAoKTsKIAkJCQlpZiAoZXJyIDwgMCkKIAkJCQkJc3ZjX3NvY2tfbmFtZXMoYnVmK3N0cmxlbihidWYpKzEsIG5mc2Rfc2VydiwgYnVmKTsKIAkJCX0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzZmguYyBiL2ZzL25mc2QvbmZzZmguYwppbmRleCBlYTM3Yzk2Li5jZDI1ZDkxIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2ZoLmMKKysrIGIvZnMvbmZzZC9uZnNmaC5jCkBAIC0zMDIsMTcgKzMwMiwyNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQlpZiAoIShhY2Nlc3MgJiBORlNEX01BWV9MT0NLKSkgewotCQkvKgotCQkgKiBwc2V1ZG9mbGF2b3IgcmVzdHJpY3Rpb25zIGFyZSBub3QgZW5mb3JjZWQgb24gTkxNLAotCQkgKiB3aGljaCBjbGllbnRzIHZpcnR1YWxseSBhbHdheXMgdXNlIGF1dGhfc3lzIGZvciwKLQkJICogZXZlbiB3aGlsZSB1c2luZyBSUENTRUNfR1NTIGZvciBORlMuCi0JCSAqLwotCQllcnJvciA9IGNoZWNrX25mc2RfYWNjZXNzKGV4cCwgcnFzdHApOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDsKLQl9CisJLyoKKwkgKiBwc2V1ZG9mbGF2b3IgcmVzdHJpY3Rpb25zIGFyZSBub3QgZW5mb3JjZWQgb24gTkxNLAorCSAqIHdoaWNoIGNsaWVudHMgdmlydHVhbGx5IGFsd2F5cyB1c2UgYXV0aF9zeXMgZm9yLAorCSAqIGV2ZW4gd2hpbGUgdXNpbmcgUlBDU0VDX0dTUyBmb3IgTkZTLgorCSAqLworCWlmIChhY2Nlc3MgJiBORlNEX01BWV9MT0NLKQorCQlnb3RvIHNraXBfcHNldWRvZmxhdm9yX2NoZWNrOworCS8qCisJICogQ2xpZW50cyBtYXkgZXhwZWN0IHRvIGJlIGFibGUgdG8gdXNlIGF1dGhfc3lzIGR1cmluZyBtb3VudCwKKwkgKiBldmVuIGlmIHRoZXkgdXNlIGdzcyBmb3IgZXZlcnl0aGluZyBlbHNlOyBzZWUgc2VjdGlvbiAyLjMuMgorCSAqIG9mIHJmYyAyNjIzLgorCSAqLworCWlmIChhY2Nlc3MgJiBORlNEX01BWV9CWVBBU1NfR1NTX09OX1JPT1QKKwkJCSYmIGV4cC0+ZXhfcGF0aC5kZW50cnkgPT0gZGVudHJ5KQorCQlnb3RvIHNraXBfcHNldWRvZmxhdm9yX2NoZWNrOwogCisJZXJyb3IgPSBjaGVja19uZnNkX2FjY2VzcyhleHAsIHJxc3RwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCitza2lwX3BzZXVkb2ZsYXZvcl9jaGVjazoKIAkvKiBGaW5hbGx5LCBjaGVjayBhY2Nlc3MgcGVybWlzc2lvbnMuICovCiAJZXJyb3IgPSBuZnNkX3Blcm1pc3Npb24ocnFzdHAsIGV4cCwgZGVudHJ5LCBhY2Nlc3MpOwogCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3Byb2MuYyBiL2ZzL25mc2QvbmZzcHJvYy5jCmluZGV4IDA3NjZmOTUuLjVjZmZlY2EgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzcHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzcHJvYy5jCkBAIC02NSw3ICs2NSw4IEBACiAJZHByaW50aygibmZzZDogR0VUQVRUUiAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIAogCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOwotCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJnJlc3AtPmZoLCAwLCBORlNEX01BWV9OT1ApOworCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJnJlc3AtPmZoLCAwLAorCQkJTkZTRF9NQVlfTk9QIHwgTkZTRF9NQVlfQllQQVNTX0dTU19PTl9ST09UKTsKIAlyZXR1cm4gbmZzZF9yZXR1cm5fYXR0cnMobmZzZXJyLCByZXNwKTsKIH0KIApAQCAtNTIxLDcgKzUyMiw4IEBACiAKIAlkcHJpbnRrKCJuZnNkOiBTVEFURlMgICAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOwogCi0JbmZzZXJyID0gbmZzZF9zdGF0ZnMocnFzdHAsICZhcmdwLT5maCwgJnJlc3AtPnN0YXRzKTsKKwluZnNlcnIgPSBuZnNkX3N0YXRmcyhycXN0cCwgJmFyZ3AtPmZoLCAmcmVzcC0+c3RhdHMsCisJCQlORlNEX01BWV9CWVBBU1NfR1NTX09OX1JPT1QpOwogCWZoX3B1dCgmYXJncC0+ZmgpOwogCXJldHVybiBuZnNlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3N2Yy5jIGIvZnMvbmZzZC9uZnNzdmMuYwppbmRleCA4MDI5MmZmLi41OWVlYjQ2IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3N2Yy5jCisrKyBiL2ZzL25mc2QvbmZzc3ZjLmMKQEAgLTIyOSw2ICsyMjksNyBAQAogCiAJYXRvbWljX3NldCgmbmZzZF9idXN5LCAwKTsKIAluZnNkX3NlcnYgPSBzdmNfY3JlYXRlX3Bvb2xlZCgmbmZzZF9wcm9ncmFtLCBuZnNkX21heF9ibGtzaXplLAorCQkJCSAgICAgIEFGX0lORVQsCiAJCQkJICAgICAgbmZzZF9sYXN0X3RocmVhZCwgbmZzZCwgVEhJU19NT0RVTEUpOwogCWlmIChuZnNkX3NlcnYgPT0gTlVMTCkKIAkJZXJyID0gLUVOT01FTTsKQEAgLTI0MywyNSArMjQ0LDIwIEBACiAJaWYgKCFsaXN0X2VtcHR5KCZuZnNkX3NlcnYtPnN2X3Blcm1zb2NrcykpCiAJCXJldHVybiAwOwogCi0JZXJyb3IgPSBsb2NrZF91cChJUFBST1RPX1VEUCk7Ci0JaWYgKGVycm9yID49IDApIHsKLQkJZXJyb3IgPSBzdmNfY3JlYXRlX3hwcnQobmZzZF9zZXJ2LCAidWRwIiwgcG9ydCwKKwllcnJvciA9IHN2Y19jcmVhdGVfeHBydChuZnNkX3NlcnYsICJ1ZHAiLCBwb3J0LAogCQkJCQlTVkNfU09DS19ERUZBVUxUUyk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlsb2NrZF9kb3duKCk7Ci0JfQogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIAotCWVycm9yID0gbG9ja2RfdXAoSVBQUk9UT19UQ1ApOwotCWlmIChlcnJvciA+PSAwKSB7Ci0JCWVycm9yID0gc3ZjX2NyZWF0ZV94cHJ0KG5mc2Rfc2VydiwgInRjcCIsIHBvcnQsCisJZXJyb3IgPSBzdmNfY3JlYXRlX3hwcnQobmZzZF9zZXJ2LCAidGNwIiwgcG9ydCwKIAkJCQkJU1ZDX1NPQ0tfREVGQVVMVFMpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJbG9ja2RfZG93bigpOwotCX0KIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGxvY2tkX3VwKCk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IDE4MDYwYmUuLmFhMWQwZDYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtODMsNyArODMsNiBAQAogCXNwaW5sb2NrX3QJCXBiX2xvY2s7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAKLXN0YXRpYyBzdHJ1Y3QgcmFwYXJtcyAqCQlyYXBhcm1sOwogI2RlZmluZSBSQVBBUk1fSEFTSF9CSVRTCTQKICNkZWZpbmUgUkFQQVJNX0hBU0hfU0laRQkoMTw8UkFQQVJNX0hBU0hfQklUUykKICNkZWZpbmUgUkFQQVJNX0hBU0hfTUFTSwkoUkFQQVJNX0hBU0hfU0laRS0xKQpAQCAtMTg2Niw5ICsxODY1LDkgQEAKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwogX19iZTMyCi1uZnNkX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBrc3RhdGZzICpzdGF0KQorbmZzZF9zdGF0ZnMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qga3N0YXRmcyAqc3RhdCwgaW50IGFjY2VzcykKIHsKLQlfX2JlMzIgZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAsIE5GU0RfTUFZX05PUCk7CisJX19iZTMyIGVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCAwLCBORlNEX01BWV9OT1AgfCBhY2Nlc3MpOwogCWlmICghZXJyICYmIHZmc19zdGF0ZnMoZmhwLT5maF9kZW50cnksc3RhdCkpCiAJCWVyciA9IG5mc2Vycl9pbzsKIAlyZXR1cm4gZXJyOwpAQCAtMTk2NiwxMSArMTk2NSwyMCBAQAogdm9pZAogbmZzZF9yYWNhY2hlX3NodXRkb3duKHZvaWQpCiB7Ci0JaWYgKCFyYXBhcm1sKQotCQlyZXR1cm47CisJc3RydWN0IHJhcGFybXMgKnJhcGFybSwgKmxhc3RfcmFwYXJtOworCXVuc2lnbmVkIGludCBpOworCiAJZHByaW50aygibmZzZDogZnJlZWluZyByZWFkYWhlYWQgYnVmZmVycy5cbiIpOwotCWtmcmVlKHJhcGFybWwpOwotCXJhcGFybWwgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IFJBUEFSTV9IQVNIX1NJWkU7IGkrKykgeworCQlyYXBhcm0gPSByYXBhcm1faGFzaFtpXS5wYl9oZWFkOworCQl3aGlsZShyYXBhcm0pIHsKKwkJCWxhc3RfcmFwYXJtID0gcmFwYXJtOworCQkJcmFwYXJtID0gcmFwYXJtLT5wX25leHQ7CisJCQlrZnJlZShsYXN0X3JhcGFybSk7CisJCX0KKwkJcmFwYXJtX2hhc2hbaV0ucGJfaGVhZCA9IE5VTEw7CisJfQogfQogLyoKICAqIEluaXRpYWxpemUgcmVhZGFoZWFkIHBhcmFtIGNhY2hlCkBAIC0xOTgxLDM1ICsxOTg5LDM4IEBACiAJaW50CWk7CiAJaW50CWogPSAwOwogCWludAlucGVyYnVja2V0OworCXN0cnVjdCByYXBhcm1zICoqcmFwYXJtID0gTlVMTDsKIAogCi0JaWYgKHJhcGFybWwpCisJaWYgKHJhcGFybV9oYXNoWzBdLnBiX2hlYWQpCiAJCXJldHVybiAwOwotCWlmIChjYWNoZV9zaXplIDwgMipSQVBBUk1fSEFTSF9TSVpFKQotCQljYWNoZV9zaXplID0gMipSQVBBUk1fSEFTSF9TSVpFOwotCXJhcGFybWwgPSBrY2FsbG9jKGNhY2hlX3NpemUsIHNpemVvZihzdHJ1Y3QgcmFwYXJtcyksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFyYXBhcm1sKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSJuZnNkOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IHJlYWQtYWhlYWQgY2FjaGUuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCW5wZXJidWNrZXQgPSBESVZfUk9VTkRfVVAoY2FjaGVfc2l6ZSwgUkFQQVJNX0hBU0hfU0laRSk7CisJaWYgKG5wZXJidWNrZXQgPCAyKQorCQlucGVyYnVja2V0ID0gMjsKKwljYWNoZV9zaXplID0gbnBlcmJ1Y2tldCAqIFJBUEFSTV9IQVNIX1NJWkU7CiAKIAlkcHJpbnRrKCJuZnNkOiBhbGxvY2F0aW5nICVkIHJlYWRhaGVhZCBidWZmZXJzLlxuIiwgY2FjaGVfc2l6ZSk7Ci0JZm9yIChpID0gMCA7IGkgPCBSQVBBUk1fSEFTSF9TSVpFIDsgaSsrKSB7Ci0JCXJhcGFybV9oYXNoW2ldLnBiX2hlYWQgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IFJBUEFSTV9IQVNIX1NJWkU7IGkrKykgewogCQlzcGluX2xvY2tfaW5pdCgmcmFwYXJtX2hhc2hbaV0ucGJfbG9jayk7Ci0JfQotCW5wZXJidWNrZXQgPSBESVZfUk9VTkRfVVAoY2FjaGVfc2l6ZSwgUkFQQVJNX0hBU0hfU0laRSk7Ci0JZm9yIChpID0gMDsgaSA8IGNhY2hlX3NpemUgLSAxOyBpKyspIHsKLQkJaWYgKGkgJSBucGVyYnVja2V0ID09IDApCi0JCQlyYXBhcm1faGFzaFtqKytdLnBiX2hlYWQgPSByYXBhcm1sICsgaTsKLQkJaWYgKGkgJSBucGVyYnVja2V0IDwgbnBlcmJ1Y2tldC0xKQotCQkJcmFwYXJtbFtpXS5wX25leHQgPSByYXBhcm1sICsgaSArIDE7CisKKwkJcmFwYXJtID0gJnJhcGFybV9oYXNoW2ldLnBiX2hlYWQ7CisJCWZvciAoaiA9IDA7IGogPCBucGVyYnVja2V0OyBqKyspIHsKKwkJCSpyYXBhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFwYXJtcyksIEdGUF9LRVJORUwpOworCQkJaWYgKCEqcmFwYXJtKQorCQkJCWdvdG8gb3V0X25vbWVtOworCQkJcmFwYXJtID0gJigqcmFwYXJtKS0+cF9uZXh0OworCQl9CisJCSpyYXBhcm0gPSBOVUxMOwogCX0KIAogCW5mc2RzdGF0cy5yYV9zaXplID0gY2FjaGVfc2l6ZTsKIAlyZXR1cm4gMDsKKworb3V0X25vbWVtOgorCWRwcmludGsoIm5mc2Q6IGttYWxsb2MgZmFpbGVkLCBmcmVlaW5nIHJlYWRhaGVhZCBidWZmZXJzXG4iKTsKKwluZnNkX3JhY2FjaGVfc2h1dGRvd24oKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjJfQUNMKSB8fCBkZWZpbmVkKENPTkZJR19ORlNEX1YzX0FDTCkKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL01ha2VmaWxlIGIvZnMvb2NmczIvTWFrZWZpbGUKaW5kZXggZjY5NTZkZS4uNTg5ZGNkZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvTWFrZWZpbGUKKysrIGIvZnMvb2NmczIvTWFrZWZpbGUKQEAgLTM0LDcgKzM0LDggQEAKIAlzeW1saW5rLm8gCQlcCiAJc3lzZmlsZS5vIAkJXAogCXVwdG9kYXRlLm8JCVwKLQl2ZXIubworCXZlci5vCQkJXAorCXhhdHRyLm8KIAogb2NmczJfc3RhY2tnbHVlLW9ianMgOj0gc3RhY2tnbHVlLm8KIG9jZnMyX3N0YWNrX28yY2Itb2JqcyA6PSBzdGFja19vMmNiLm8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDI5ZmY1N2UuLjBjYzJkZWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtNDksNiArNDksMzQwIEBACiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCisKKy8qCisgKiBPcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIGV4dGVudCB0cmVlIHR5cGUuCisgKgorICogVG8gaW1wbGVtZW50IGFuIG9uLWRpc2sgYnRyZWUgKGV4dGVudCB0cmVlKSB0eXBlIGluIG9jZnMyLCBhZGQKKyAqIGFuIG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMgc3RydWN0dXJlIGFuZCB0aGUgbWF0Y2hpbmcKKyAqIG9jZnMyX2luaXRfPHRoaW5neT5fZXh0ZW50X3RyZWUoKSBmdW5jdGlvbi4gIFRoYXQncyBwcmV0dHkgbXVjaCBpdAorICogZm9yIHRoZSBhbGxvY2F0aW9uIHBvcnRpb24gb2YgdGhlIGV4dGVudCB0cmVlLgorICovCitzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucyB7CisJLyoKKwkgKiBsYXN0X2ViX2JsayBpcyB0aGUgYmxvY2sgbnVtYmVyIG9mIHRoZSByaWdodCBtb3N0IGxlYWYgZXh0ZW50CisJICogYmxvY2suICBNb3N0IG9uLWRpc2sgc3RydWN0dXJlcyBjb250YWluaW5nIGFuIGV4dGVudCB0cmVlIHN0b3JlCisJICogdGhpcyB2YWx1ZSBmb3IgZmFzdCBhY2Nlc3MuICBUaGUgLT5lb19zZXRfbGFzdF9lYl9ibGsoKSBhbmQKKwkgKiAtPmVvX2dldF9sYXN0X2ViX2JsaygpIG9wZXJhdGlvbnMgYWNjZXNzIHRoaXMgdmFsdWUuICBUaGV5IGFyZQorCSAqICBib3RoIHJlcXVpcmVkLgorCSAqLworCXZvaWQgKCplb19zZXRfbGFzdF9lYl9ibGspKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJICAgdTY0IGJsa25vKTsKKwl1NjQgKCplb19nZXRfbGFzdF9lYl9ibGspKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpOworCisJLyoKKwkgKiBUaGUgb24tZGlzayBzdHJ1Y3R1cmUgdXN1YWxseSBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0b3RhbAorCSAqIGNsdXN0ZXJzIGFyZSBzdG9yZWQgaW4gdGhpcyBleHRlbnQgdHJlZS4gIFRoaXMgZnVuY3Rpb24gdXBkYXRlcworCSAqIHRoYXQgdmFsdWUuICBuZXdfY2x1c3RlcnMgaXMgdGhlIGRlbHRhLCBhbmQgbXVzdCBiZQorCSAqIGFkZGVkIHRvIHRoZSB0b3RhbC4gIFJlcXVpcmVkLgorCSAqLworCXZvaWQgKCplb191cGRhdGVfY2x1c3RlcnMpKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICB1MzIgbmV3X2NsdXN0ZXJzKTsKKworCS8qCisJICogSWYgLT5lb19pbnNlcnRfY2hlY2soKSBleGlzdHMsIGl0IGlzIGNhbGxlZCBiZWZvcmUgcmVjIGlzCisJICogaW5zZXJ0ZWQgaW50byB0aGUgZXh0ZW50IHRyZWUuICBJdCBpcyBvcHRpb25hbC4KKwkgKi8KKwlpbnQgKCplb19pbnNlcnRfY2hlY2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjKTsKKwlpbnQgKCplb19zYW5pdHlfY2hlY2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpOworCisJLyoKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFRoZSByZW1haW5pbmcgYXJlIGludGVybmFsIHRvIG9jZnMyX2V4dGVudF90cmVlIGFuZCBkb24ndCBoYXZlCisJICogYWNjZXNzb3IgZnVuY3Rpb25zCisJICovCisKKwkvKgorCSAqIC0+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+bF90cmVlX2RlcHRoKTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAogCUJVR19PTihtZXRhX2FjID09IE5VTEwpOwogCi0Jc2hpZnQgPSBvY2ZzMl9maW5kX2JyYW5jaF90YXJnZXQob3NiLCBpbm9kZSwgZGlfYmgsICZiaCk7CisJc2hpZnQgPSBvY2ZzMl9maW5kX2JyYW5jaF90YXJnZXQob3NiLCBpbm9kZSwgZXQsICZiaCk7CiAJaWYgKHNoaWZ0IDwgMCkgewogCQlyZXQgPSBzaGlmdDsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtOTQ4LDcgKzEyNTIsNyBAQAogCQkvKiBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoIHdpbGwgcmV0dXJuIHVzIGEgYnVmZmVyIHdpdGgKIAkJICogdGhlIG5ldyBleHRlbnQgYmxvY2sgKHNvIHdlIGNhbiBwYXNzIHRoYXQgdG8KIAkJICogb2NmczJfYWRkX2JyYW5jaCkuICovCi0JCXJldCA9IG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGgob3NiLCBoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJcmV0ID0gb2NmczJfc2hpZnRfdHJlZV9kZXB0aChvc2IsIGhhbmRsZSwgaW5vZGUsIGV0LAogCQkJCQkgICAgIG1ldGFfYWMsICZiaCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC05NzUsNyArMTI3OSw3IEBACiAJLyogY2FsbCBvY2ZzMl9hZGRfYnJhbmNoIHRvIGFkZCB0aGUgZmluYWwgcGFydCBvZiB0aGUgdHJlZSB3aXRoCiAJICogdGhlIG5ldyBkYXRhLiAqLwogCW1sb2coMCwgImFkZCBicmFuY2guIGJoID0gJXBcbiIsIGJoKTsKLQlyZXQgPSBvY2ZzMl9hZGRfYnJhbmNoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZGlfYmgsIGJoLCBsYXN0X2ViX2JoLAorCXJldCA9IG9jZnMyX2FkZF9icmFuY2gob3NiLCBoYW5kbGUsIGlub2RlLCBldCwgYmgsIGxhc3RfZWJfYmgsCiAJCQkgICAgICAgbWV0YV9hYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMTIzNiw4ICsxNTQwLDcgQEAKIAogCQlicmVsc2UoYmgpOwogCQliaCA9IE5VTEw7Ci0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBibGtubywKLQkJCQkgICAgICAgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMjA1OCwxMSArMjM2MSwxMSBAQAogCQkJCSAgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCiAJCQkJICAgICBpbnQgc3VidHJlZV9pbmRleCwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAotCQkJCSAgICAgaW50ICpkZWxldGVkKQorCQkJCSAgICAgaW50ICpkZWxldGVkLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKIHsKIAlpbnQgcmV0LCBpLCBkZWxfcmlnaHRfc3VidHJlZSA9IDAsIHJpZ2h0X2hhc19lbXB0eSA9IDA7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLCAqZGlfYmggPSBwYXRoX3Jvb3RfYmgocmlnaHRfcGF0aCk7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLCAqZXRfcm9vdF9iaCA9IHBhdGhfcm9vdF9iaChyaWdodF9wYXRoKTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJpZ2h0X2xlYWZfZWwsICpsZWZ0X2xlYWZfZWw7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CiAKQEAgLTIxMTQsNyArMjQxNyw3IEBACiAJCSAqIFdlIGhhdmUgdG8gdXBkYXRlIGlfbGFzdF9lYl9ibGsgZHVyaW5nIHRoZSBtZXRhCiAJCSAqIGRhdGEgZGVsZXRlLgogCQkgKi8KLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0X3Jvb3RfYmgsCiAJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMjE4OSw3ICsyNDkyLDcgQEAKIAkJb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3Rocyhpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOwogCiAJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9kYXRhOwotCQlkaS0+aV9sYXN0X2ViX2JsayA9IGViLT5oX2Jsa25vOworCQlvY2ZzMl9ldF9zZXRfbGFzdF9lYl9ibGsoZXQsIGxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSk7CiAKIAkJLyoKIAkJICogUmVtb3ZhbCBvZiB0aGUgZXh0ZW50IGluIHRoZSBsZWZ0IGxlYWYgd2FzIHNraXBwZWQKQEAgLTIxOTksNyArMjUwMiw3IEBACiAJCWlmIChyaWdodF9oYXNfZW1wdHkpCiAJCQlvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KGxlZnRfbGVhZl9lbCk7CiAKLQkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGV0X3Jvb3RfYmgpOwogCQlpZiAocmV0KQogCQkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC0yMzIyLDcgKzI2MjUsOCBAQAogCQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLCBpbnQgb3JpZ19jcmVkaXRzLAogCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKIAkJCQkgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCi0JCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICoqZW1wdHlfZXh0ZW50X3BhdGgpCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICoqZW1wdHlfZXh0ZW50X3BhdGgsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCiB7CiAJaW50IHJldCwgc3VidHJlZV9yb290LCBkZWxldGVkOwogCXUzMiByaWdodF9jcG9zOwpAQCAtMjM5NSw3ICsyNjk5LDcgQEAKIAogCQlyZXQgPSBvY2ZzMl9yb3RhdGVfc3VidHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKIAkJCQkJCXJpZ2h0X3BhdGgsIHN1YnRyZWVfcm9vdCwKLQkJCQkJCWRlYWxsb2MsICZkZWxldGVkKTsKKwkJCQkJCWRlYWxsb2MsICZkZWxldGVkLCBldCk7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikgewogCQkJLyoKIAkJCSAqIFRoZSByb3RhdGlvbiBoYXMgdG8gdGVtcG9yYXJpbHkgc3RvcCBkdWUgdG8KQEAgLTI0MzgsMjkgKzI3NDIsMjAgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9yZW1vdmVfcmlnaHRtb3N0X3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQorCQkJCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCiB7CiAJaW50IHJldCwgc3VidHJlZV9pbmRleDsKIAl1MzIgY3BvczsKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCi0JLyoKLQkgKiBYWFg6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHJvb3QgaXMgYW4gaW5vZGUsIHdoaWNoIGlzCi0JICogdHJ1ZSBmb3Igbm93IGJ1dCBtYXkgY2hhbmdlIGFzIHRyZWUgY29kZSBnZXRzIGdlbmVyaWMuCi0JICovCi0JZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXBhdGhfcm9vdF9iaChwYXRoKS0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGRpKSkgewotCQlyZXQgPSAtRUlPOwotCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKLQkJCSAgICAiSW5vZGUgJWxsdSBoYXMgaW52YWxpZCBwYXRoIHJvb3QiLAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQkJZ290byBvdXQ7Ci0JfQogCisJcmV0ID0gb2NmczJfZXRfc2FuaXR5X2NoZWNrKGlub2RlLCBldCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAJLyoKIAkgKiBUaGVyZSdzIHR3byB3YXlzIHdlIGhhbmRsZSB0aGlzIGRlcGVuZGluZyBvbgogCSAqIHdoZXRoZXIgcGF0aCBpcyB0aGUgb25seSBleGlzdGluZyBvbmUuCkBAIC0yNTE3LDcgKzI4MTIsNyBAQAogCQlvY2ZzMl91cGRhdGVfZWRnZV9sZW5ndGhzKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCk7CiAKIAkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLT5iX2RhdGE7Ci0JCWRpLT5pX2xhc3RfZWJfYmxrID0gZWItPmhfYmxrbm87CisJCW9jZnMyX2V0X3NldF9sYXN0X2ViX2JsayhldCwgbGU2NF90b19jcHUoZWItPmhfYmxrbm8pKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiAncGF0aCcgaXMgYWxzbyB0aGUgbGVmdG1vc3QgcGF0aCB3aGljaApAQCAtMjUyOCwxMiArMjgyMywxMiBAQAogCQkgKi8KIAkJb2NmczJfdW5saW5rX3BhdGgoaW5vZGUsIGhhbmRsZSwgZGVhbGxvYywgcGF0aCwgMSk7CiAKLQkJZWwgPSAmZGktPmlkMi5pX2xpc3Q7CisJCWVsID0gZXQtPmV0X3Jvb3RfZWw7CiAJCWVsLT5sX3RyZWVfZGVwdGggPSAwOwogCQllbC0+bF9uZXh0X2ZyZWVfcmVjID0gMDsKIAkJbWVtc2V0KCZlbC0+bF9yZWNzWzBdLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKIAotCQlkaS0+aV9sYXN0X2ViX2JsayA9IDA7CisJCW9jZnMyX2V0X3NldF9sYXN0X2ViX2JsayhldCwgMCk7CiAJfQogCiAJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGhfcm9vdF9iaChwYXRoKSk7CkBAIC0yNTYxLDcgKzI4NTYsOCBAQAogICovCiBzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAotCQkJCSAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCisJCQkJICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCiB7CiAJaW50IHJldCwgb3JpZ19jcmVkaXRzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOwogCXN0cnVjdCBvY2ZzMl9wYXRoICp0bXBfcGF0aCA9IE5VTEwsICpyZXN0YXJ0X3BhdGggPSBOVUxMOwpAQCAtMjU3NSw3ICsyODcxLDcgQEAKIAlpZiAocGF0aC0+cF90cmVlX2RlcHRoID09IDApIHsKIHJpZ2h0bW9zdF9ub19kZWxldGU6CiAJCS8qCi0JCSAqIEluLWlub2RlIGV4dGVudHMuIFRoaXMgaXMgdHJpdmlhbGx5IGhhbmRsZWQsIHNvIGRvCisJCSAqIElubGluZSBleHRlbnRzLiBUaGlzIGlzIHRyaXZpYWxseSBoYW5kbGVkLCBzbyBkbwogCQkgKiBpdCB1cCBmcm9udC4KIAkJICovCiAJCXJldCA9IG9jZnMyX3JvdGF0ZV9yaWdodG1vc3RfbGVhZl9sZWZ0KGlub2RlLCBoYW5kbGUsCkBAIC0yNjI5LDcgKzI5MjUsNyBAQAogCQkgKi8KIAogCQlyZXQgPSBvY2ZzMl9yZW1vdmVfcmlnaHRtb3N0X3BhdGgoaW5vZGUsIGhhbmRsZSwgcGF0aCwKLQkJCQkJCSAgZGVhbGxvYyk7CisJCQkJCQkgIGRlYWxsb2MsIGV0KTsKIAkJaWYgKHJldCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0yNjQxLDcgKzI5MzcsNyBAQAogCSAqLwogdHJ5X3JvdGF0ZToKIAlyZXQgPSBfX29jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgb3JpZ19jcmVkaXRzLCBwYXRoLAotCQkJCSAgICAgICBkZWFsbG9jLCAmcmVzdGFydF9wYXRoKTsKKwkJCQkgICAgICAgZGVhbGxvYywgJnJlc3RhcnRfcGF0aCwgZXQpOwogCWlmIChyZXQgJiYgcmV0ICE9IC1FQUdBSU4pIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTI2NTMsNyArMjk0OSw3IEBACiAKIAkJcmV0ID0gX19vY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIG9yaWdfY3JlZGl0cywKIAkJCQkJICAgICAgIHRtcF9wYXRoLCBkZWFsbG9jLAotCQkJCQkgICAgICAgJnJlc3RhcnRfcGF0aCk7CisJCQkJCSAgICAgICAmcmVzdGFydF9wYXRoLCBldCk7CiAJCWlmIChyZXQgJiYgcmV0ICE9IC1FQUdBSU4pIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMjkzOSw2ICszMjM1LDcgQEAKIAkJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCiAJCQkJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQlpbnQgaW5kZXgpCiB7CiAJaW50IHJldCwgaSwgc3VidHJlZV9pbmRleCA9IDAsIGhhc19lbXB0eV9leHRlbnQgPSAwOwpAQCAtMzA1OSw3ICszMzU2LDggQEAKIAkJICAgIGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDEpIHsKIAogCQkJcmV0ID0gb2NmczJfcmVtb3ZlX3JpZ2h0bW9zdF9wYXRoKGlub2RlLCBoYW5kbGUsCi0JCQkJCQkJICByaWdodF9wYXRoLCBkZWFsbG9jKTsKKwkJCQkJCQkgIHJpZ2h0X3BhdGgsCisJCQkJCQkJICBkZWFsbG9jLCBldCk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCWdvdG8gb3V0OwpAQCAtMzA4Niw3ICszMzg0LDggQEAKIAkJCQkgICAgIGludCBzcGxpdF9pbmRleCwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9tZXJnZV9jdHh0ICpjdHh0KQorCQkJCSAgICAgc3RydWN0IG9jZnMyX21lcmdlX2N0eHQgKmN0eHQsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogCiB7CiAJaW50IHJldCA9IDA7CkBAIC0zMTA0LDcgKzM0MDMsNyBAQAogCQkgKiBpbGxlZ2FsLgogCQkgKi8KIAkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLAotCQkJCQkgICAgIGRlYWxsb2MpOworCQkJCQkgICAgIGRlYWxsb2MsIGV0KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0zMTQ3LDcgKzM0NDYsOCBAQAogCQlCVUdfT04oIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpOwogCiAJCS8qIFRoZSBtZXJnZSBsZWZ0IHVzIHdpdGggYW4gZW1wdHkgZXh0ZW50LCByZW1vdmUgaXQuICovCi0JCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZGVhbGxvYyk7CisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwKKwkJCQkJICAgICBkZWFsbG9jLCBldCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzE2MSw3ICszNDYxLDcgQEAKIAkJICovCiAJCXJldCA9IG9jZnMyX21lcmdlX3JlY19sZWZ0KGlub2RlLCBwYXRoLAogCQkJCQkgICBoYW5kbGUsIHJlYywKLQkJCQkJICAgZGVhbGxvYywKKwkJCQkJICAgZGVhbGxvYywgZXQsCiAJCQkJCSAgIHNwbGl0X2luZGV4KTsKIAogCQlpZiAocmV0KSB7CkBAIC0zMTcwLDcgKzM0NzAsNyBAQAogCQl9CiAKIAkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLAotCQkJCQkgICAgIGRlYWxsb2MpOworCQkJCQkgICAgIGRlYWxsb2MsIGV0KTsKIAkJLyoKIAkJICogRXJyb3IgZnJvbSB0aGlzIGxhc3Qgcm90YXRlIGlzIG5vdCBjcml0aWNhbCwgc28KIAkJICogcHJpbnQgYnV0IGRvbid0IGJ1YmJsZSBpdCB1cC4KQEAgLTMxOTAsNyArMzQ5MCw3IEBACiAJCQlyZXQgPSBvY2ZzMl9tZXJnZV9yZWNfbGVmdChpbm9kZSwKIAkJCQkJCSAgIHBhdGgsCiAJCQkJCQkgICBoYW5kbGUsIHNwbGl0X3JlYywKLQkJCQkJCSAgIGRlYWxsb2MsCisJCQkJCQkgICBkZWFsbG9jLCBldCwKIAkJCQkJCSAgIHNwbGl0X2luZGV4KTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zMjEzLDcgKzM1MTMsNyBAQAogCQkJICogb3VyIGxlYWYuIFRyeSB0byByb3RhdGUgaXQgYXdheS4KIAkJCSAqLwogCQkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLAotCQkJCQkJICAgICBkZWFsbG9jKTsKKwkJCQkJCSAgICAgZGVhbGxvYywgZXQpOwogCQkJaWYgKHJldCkKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlyZXQgPSAwOwpAQCAtMzM0NywxNiArMzY0Nyw2IEBACiAJb2NmczJfcm90YXRlX2xlYWYoZWwsIGluc2VydF9yZWMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfdXBkYXRlX2Rpbm9kZV9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkJCQl1MzIgY2x1c3RlcnMpCi17Ci0JbGUzMl9hZGRfY3B1KCZkaS0+aV9jbHVzdGVycywgY2x1c3RlcnMpOwotCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKTsKLQlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotfQotCiBzdGF0aWMgdm9pZCBvY2ZzMl9hZGp1c3RfcmlnaHRtb3N0X3JlY29yZHMoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCkBAIC0zNTU4LDggKzM4NDgsOCBAQAogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiBvbmx5IGRvZXMgaW5zZXJ0cyBvbiBhbiBhbGxvY2F0aW9uIGItdHJlZS4gRm9yIGRpbm9kZQotICogbGlzdHMsIG9jZnMyX2luc2VydF9hdF9sZWFmKCkgaXMgY2FsbGVkIGRpcmVjdGx5LgorICogVGhpcyBmdW5jdGlvbiBvbmx5IGRvZXMgaW5zZXJ0cyBvbiBhbiBhbGxvY2F0aW9uIGItdHJlZS4gRm9yIHRyZWUKKyAqIGRlcHRoID0gMCwgb2NmczJfaW5zZXJ0X2F0X2xlYWYoKSBpcyBjYWxsZWQgZGlyZWN0bHkuCiAgKgogICogcmlnaHRfcGF0aCBpcyB0aGUgcGF0aCB3ZSB3YW50IHRvIGRvIHRoZSBhY3R1YWwgaW5zZXJ0CiAgKiBpbi4gbGVmdF9wYXRoIHNob3VsZCBvbmx5IGJlIHBhc3NlZCBpbiBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGF0CkBAIC0zNjU2LDcgKzM5NDYsNyBAQAogCiBzdGF0aWMgaW50IG9jZnMyX2RvX2luc2VydF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICppbnNlcnRfcmVjLAogCQkJCSAgc3RydWN0IG9jZnMyX2luc2VydF90eXBlICp0eXBlKQogewpAQCAtMzY2NCwxMyArMzk1NCwxMSBAQAogCXUzMiBjcG9zOwogCXN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCi0JZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBkaV9iaC0+Yl9kYXRhOwotCWVsID0gJmRpLT5pZDIuaV9saXN0OworCWVsID0gZXQtPmV0X3Jvb3RfZWw7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKIAkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zNjgyLDcgKzM5NzAsNyBAQAogCQlnb3RvIG91dF91cGRhdGVfY2x1c3RlcnM7CiAJfQogCi0JcmlnaHRfcGF0aCA9IG9jZnMyX25ld19pbm9kZV9wYXRoKGRpX2JoKTsKKwlyaWdodF9wYXRoID0gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsKTsKIAlpZiAoIXJpZ2h0X3BhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMzczMiw3ICs0MDIwLDcgQEAKIAkJICogb2NmczJfcm90YXRlX3RyZWVfcmlnaHQoKSBtaWdodCBoYXZlIGV4dGVuZGVkIHRoZQogCQkgKiB0cmFuc2FjdGlvbiB3aXRob3V0IHJlLWpvdXJuYWxpbmcgb3VyIHRyZWUgcm9vdC4KIAkJICovCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKIAkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zNzU3LDEwICs0MDQ1LDEwIEBACiAKIG91dF91cGRhdGVfY2x1c3RlcnM6CiAJaWYgKHR5cGUtPmluc19zcGxpdCA9PSBTUExJVF9OT05FKQotCQlvY2ZzMl91cGRhdGVfZGlub2RlX2NsdXN0ZXJzKGlub2RlLCBkaSwKLQkJCQkJICAgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKwkJb2NmczJfZXRfdXBkYXRlX2NsdXN0ZXJzKGlub2RlLCBldCwKKwkJCQkJIGxlMTZfdG9fY3B1KGluc2VydF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZXQtPmV0X3Jvb3RfYmgpOwogCWlmIChyZXQpCiAJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtMzg5MCw3ICs0MTc4LDggQEAKIHN0YXRpYyB2b2lkIG9jZnMyX2ZpZ3VyZV9jb250aWdfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLAotCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMpCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYywKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCiB7CiAJaW50IGk7CiAJZW51bSBvY2ZzMl9jb250aWdfdHlwZSBjb250aWdfdHlwZSA9IENPTlRJR19OT05FOwpAQCAtMzkwNiw2ICs0MTk1LDIxIEBACiAJCX0KIAl9CiAJaW5zZXJ0LT5pbnNfY29udGlnID0gY29udGlnX3R5cGU7CisKKwlpZiAoaW5zZXJ0LT5pbnNfY29udGlnICE9IENPTlRJR19OT05FKSB7CisJCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMgPQorCQkJCSZlbC0+bF9yZWNzW2luc2VydC0+aW5zX2NvbnRpZ19pbmRleF07CisJCXVuc2lnbmVkIGludCBsZW4gPSBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycykgKworCQkJCSAgIGxlMTZfdG9fY3B1KGluc2VydF9yZWMtPmVfbGVhZl9jbHVzdGVycyk7CisKKwkJLyoKKwkJICogQ2FsbGVyIG1pZ2h0IHdhbnQgdXMgdG8gbGltaXQgdGhlIHNpemUgb2YgZXh0ZW50cywgZG9uJ3QKKwkJICogY2FsY3VsYXRlIGNvbnRpZ3VvdXNuZXNzIGlmIHdlIG1pZ2h0IGV4Y2VlZCB0aGF0IGxpbWl0LgorCQkgKi8KKwkJaWYgKGV0LT5ldF9tYXhfbGVhZl9jbHVzdGVycyAmJgorCQkgICAgKGxlbiA+IGV0LT5ldF9tYXhfbGVhZl9jbHVzdGVycykpCisJCQlpbnNlcnQtPmluc19jb250aWcgPSBDT05USUdfTk9ORTsKKwl9CiB9CiAKIC8qCkBAIC0zOTE0LDggKzQyMTgsOCBAQAogICogb2NmczJfZmlndXJlX2FwcGVuZGluZ190eXBlKCkgd2lsbCBmaWd1cmUgb3V0IHdoZXRoZXIgd2UnbGwgaGF2ZSB0bwogICogaW5zZXJ0IGF0IHRoZSB0YWlsIG9mIHRoZSByaWdodG1vc3QgbGVhZi4KICAqCi0gKiBUaGlzIHNob3VsZCBhbHNvIHdvcmsgYWdhaW5zdCB0aGUgZGlub2RlIGxpc3QgZm9yIHRyZWUncyB3aXRoIDAKLSAqIGRlcHRoLiBJZiB3ZSBjb25zaWRlciB0aGUgZGlub2RlIGxpc3QgdG8gYmUgdGhlIHJpZ2h0bW9zdCBsZWFmIG5vZGUKKyAqIFRoaXMgc2hvdWxkIGFsc28gd29yayBhZ2FpbnN0IHRoZSByb290IGV4dGVudCBsaXN0IGZvciB0cmVlJ3Mgd2l0aCAwCisgKiBkZXB0aC4gSWYgd2UgY29uc2lkZXIgdGhlIHJvb3QgZXh0ZW50IGxpc3QgdG8gYmUgdGhlIHJpZ2h0bW9zdCBsZWFmIG5vZGUKICAqIHRoZW4gdGhlIGxvZ2ljIGhlcmUgbWFrZXMgc2Vuc2UuCiAgKi8KIHN0YXRpYyB2b2lkIG9jZnMyX2ZpZ3VyZV9hcHBlbmRpbmdfdHlwZShzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgKmluc2VydCwKQEAgLTM5NjYsMTQgKzQyNzAsMTMgQEAKICAqIHN0cnVjdHVyZS4KICAqLwogc3RhdGljIGludCBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKIAkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMsCiAJCQkJICAgIGludCAqZnJlZV9yZWNvcmRzLAogCQkJCSAgICBzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgKmluc2VydCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAJc3RydWN0IG9jZnMyX3BhdGggKnBhdGggPSBOVUxMOwpAQCAtMzk4MSw3ICs0Mjg0LDcgQEAKIAogCWluc2VydC0+aW5zX3NwbGl0ID0gU1BMSVRfTk9ORTsKIAotCWVsID0gJmRpLT5pZDIuaV9saXN0OworCWVsID0gZXQtPmV0X3Jvb3RfZWw7CiAJaW5zZXJ0LT5pbnNfdHJlZV9kZXB0aCA9IGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpOwogCiAJaWYgKGVsLT5sX3RyZWVfZGVwdGgpIHsKQEAgLTM5OTEsOSArNDI5NCw3IEBACiAJCSAqIG9jZnMyX2ZpZ3VyZV9pbnNlcnRfdHlwZSgpIGFuZCBvY2ZzMl9hZGRfYnJhbmNoKCkKIAkJICogbWF5IHdhbnQgaXQgbGF0ZXIuCiAJCSAqLwotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkgICAgICAgbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspLCAmYmgsCi0JCQkJICAgICAgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpLCAmYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2V4aXQocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNDAxNCwxMiArNDMxNSwxMiBAQAogCQlsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKIAogCWlmICghaW5zZXJ0LT5pbnNfdHJlZV9kZXB0aCkgewotCQlvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoaW5vZGUsIGluc2VydCwgZWwsIGluc2VydF9yZWMpOworCQlvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoaW5vZGUsIGluc2VydCwgZWwsIGluc2VydF9yZWMsIGV0KTsKIAkJb2NmczJfZmlndXJlX2FwcGVuZGluZ190eXBlKGluc2VydCwgZWwsIGluc2VydF9yZWMpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlwYXRoID0gb2NmczJfbmV3X2lub2RlX3BhdGgoZGlfYmgpOworCXBhdGggPSBvY2ZzMl9uZXdfcGF0aChldC0+ZXRfcm9vdF9iaCwgZXQtPmV0X3Jvb3RfZWwpOwogCWlmICghcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC00MDQ4LDcgKzQzNDksNyBAQAogICAgICAgICAgKiAgICAgaW50byB0d28gdHlwZXMgb2YgYXBwZW5kczogc2ltcGxlIHJlY29yZCBhcHBlbmQsIG9yIGEKICAgICAgICAgICogICAgIHJvdGF0ZSBpbnNpZGUgdGhlIHRhaWwgbGVhZi4KIAkgKi8KLQlvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoaW5vZGUsIGluc2VydCwgZWwsIGluc2VydF9yZWMpOworCW9jZnMyX2ZpZ3VyZV9jb250aWdfdHlwZShpbm9kZSwgaW5zZXJ0LCBlbCwgaW5zZXJ0X3JlYywgZXQpOwogCiAJLyoKIAkgKiBUaGUgaW5zZXJ0IGNvZGUgaXNuJ3QgcXVpdGUgcmVhZHkgdG8gZGVhbCB3aXRoIGFsbCBjYXNlcyBvZgpAQCAtNDA2OSw3ICs0MzcwLDggQEAKIAkgKiB0aGUgY2FzZSB0aGF0IHdlJ3JlIGRvaW5nIGEgdGFpbCBhcHBlbmQsIHNvIG1heWJlIHdlIGNhbgogCSAqIHRha2UgYWR2YW50YWdlIG9mIHRoYXQgaW5mb3JtYXRpb24gc29tZWhvdy4KIAkgKi8KLQlpZiAobGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspID09IHBhdGhfbGVhZl9iaChwYXRoKS0+Yl9ibG9ja25yKSB7CisJaWYgKG9jZnMyX2V0X2dldF9sYXN0X2ViX2JsayhldCkgPT0KKwkgICAgcGF0aF9sZWFmX2JoKHBhdGgpLT5iX2Jsb2NrbnIpIHsKIAkJLyoKIAkJICogT2ssIG9jZnMyX2ZpbmRfcGF0aCgpIHJldHVybmVkIHVzIHRoZSByaWdodG1vc3QKIAkJICogdHJlZSBwYXRoLiBUaGlzIG1pZ2h0IGJlIGFuIGFwcGVuZGluZyBpbnNlcnQuIFRoZXJlIGFyZQpAQCAtNDA5OSw3ICs0NDAxLDcgQEAKIGludCBvY2ZzMl9pbnNlcnRfZXh0ZW50KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAorCQkJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCXUzMiBjcG9zLAogCQkJdTY0IHN0YXJ0X2JsaywKIAkJCXUzMiBuZXdfY2x1c3RlcnMsCkBAIC00MTEyLDI2ICs0NDE0LDIxIEBACiAJc3RydWN0IG9jZnMyX2luc2VydF90eXBlIGluc2VydCA9IHswLCB9OwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHJlYzsKIAotCUJVR19PTihPQ0ZTMl9JKGlub2RlKS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX0RBVEFfRkwpOwotCiAJbWxvZygwLCAiYWRkICV1IGNsdXN0ZXJzIGF0IHBvc2l0aW9uICV1IHRvIGlub2RlICVsbHVcbiIsCiAJICAgICBuZXdfY2x1c3RlcnMsIGNwb3MsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKIAotCW1sb2dfYnVnX29uX21zZyghb2NmczJfc3BhcnNlX2FsbG9jKG9zYikgJiYKLQkJCShPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMgIT0gY3BvcyksCi0JCQkiRGV2aWNlICVzLCBhc2tpbmcgZm9yIHNwYXJzZSBhbGxvY2F0aW9uOiBpbm9kZSAlbGx1LCAiCi0JCQkiY3BvcyAldSwgY2x1c3RlcnMgJXVcbiIsCi0JCQlvc2ItPmRldl9zdHIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgY3BvcywKLQkJCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7Ci0KIAltZW1zZXQoJnJlYywgMCwgc2l6ZW9mKHJlYykpOwogCXJlYy5lX2Nwb3MgPSBjcHVfdG9fbGUzMihjcG9zKTsKIAlyZWMuZV9ibGtubyA9IGNwdV90b19sZTY0KHN0YXJ0X2Jsayk7CiAJcmVjLmVfbGVhZl9jbHVzdGVycyA9IGNwdV90b19sZTE2KG5ld19jbHVzdGVycyk7CiAJcmVjLmVfZmxhZ3MgPSBmbGFnczsKKwlzdGF0dXMgPSBvY2ZzMl9ldF9pbnNlcnRfY2hlY2soaW5vZGUsIGV0LCAmcmVjKTsKKwlpZiAoc3RhdHVzKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBiYWlsOworCX0KIAotCXN0YXR1cyA9IG9jZnMyX2ZpZ3VyZV9pbnNlcnRfdHlwZShpbm9kZSwgZmVfYmgsICZsYXN0X2ViX2JoLCAmcmVjLAorCXN0YXR1cyA9IG9jZnMyX2ZpZ3VyZV9pbnNlcnRfdHlwZShpbm9kZSwgZXQsICZsYXN0X2ViX2JoLCAmcmVjLAogCQkJCQkgICZmcmVlX3JlY29yZHMsICZpbnNlcnQpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTQxNDUsNyArNDQ0Miw3IEBACiAJICAgICBmcmVlX3JlY29yZHMsIGluc2VydC5pbnNfdHJlZV9kZXB0aCk7CiAKIAlpZiAoaW5zZXJ0Lmluc19jb250aWcgPT0gQ09OVElHX05PTkUgJiYgZnJlZV9yZWNvcmRzID09IDApIHsKLQkJc3RhdHVzID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGZlX2JoLAorCQlzdGF0dXMgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZXQsCiAJCQkJCSAmaW5zZXJ0Lmluc190cmVlX2RlcHRoLCAmbGFzdF9lYl9iaCwKIAkJCQkJIG1ldGFfYWMpOwogCQlpZiAoc3RhdHVzKSB7CkBAIC00MTU1LDIwICs0NDUyLDEyNyBAQAogCX0KIAogCS8qIEZpbmFsbHksIHdlIGNhbiBhZGQgY2x1c3RlcnMuIFRoaXMgbWlnaHQgcm90YXRlIHRoZSB0cmVlIGZvciB1cy4gKi8KLQlzdGF0dXMgPSBvY2ZzMl9kb19pbnNlcnRfZXh0ZW50KGlub2RlLCBoYW5kbGUsIGZlX2JoLCAmcmVjLCAmaW5zZXJ0KTsKKwlzdGF0dXMgPSBvY2ZzMl9kb19pbnNlcnRfZXh0ZW50KGlub2RlLCBoYW5kbGUsIGV0LCAmcmVjLCAmaW5zZXJ0KTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCWVsc2UKKwllbHNlIGlmIChldC0+ZXRfb3BzID09ICZvY2ZzMl9kaW5vZGVfZXRfb3BzKQogCQlvY2ZzMl9leHRlbnRfbWFwX2luc2VydF9yZWMoaW5vZGUsICZyZWMpOwogCiBiYWlsOgotCWlmIChsYXN0X2ViX2JoKQotCQlicmVsc2UobGFzdF9lYl9iaCk7CisJYnJlbHNlKGxhc3RfZWJfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIEFsbGNhdGUgYW5kIGFkZCBjbHVzdGVycyBpbnRvIHRoZSBleHRlbnQgYi10cmVlLgorICogVGhlIG5ldyBjbHVzdGVycyhjbHVzdGVyc190b19hZGQpIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgbG9naWNhbF9vZmZzZXQuCisgKiBUaGUgZXh0ZW50IGItdHJlZSdzIHJvb3QgaXMgc3BlY2lmaWVkIGJ5IGV0LCBhbmQKKyAqIGl0IGlzIG5vdCBsaW1pdGVkIHRvIHRoZSBmaWxlIHN0b3JhZ2UuIEFueSBleHRlbnQgdHJlZSBjYW4gdXNlIHRoaXMKKyAqIGZ1bmN0aW9uIGlmIGl0IGltcGxlbWVudHMgdGhlIHByb3BlciBvY2ZzMl9leHRlbnRfdHJlZS4KKyAqLworaW50IG9jZnMyX2FkZF9jbHVzdGVyc19pbl9idHJlZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXUzMiAqbG9naWNhbF9vZmZzZXQsCisJCQkJdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQlpbnQgbWFya191bndyaXR0ZW4sCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KQoreworCWludCBzdGF0dXMgPSAwOworCWludCBmcmVlX2V4dGVudHM7CisJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgcmVhc29uID0gUkVTVEFSVF9OT05FOworCXUzMiBiaXRfb2ZmLCBudW1fYml0czsKKwl1NjQgYmxvY2s7CisJdTggZmxhZ3MgPSAwOworCisJQlVHX09OKCFjbHVzdGVyc190b19hZGQpOworCisJaWYgKG1hcmtfdW53cml0dGVuKQorCQlmbGFncyA9IE9DRlMyX0VYVF9VTldSSVRURU47CisKKwlmcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGV0KTsKKwlpZiAoZnJlZV9leHRlbnRzIDwgMCkgeworCQlzdGF0dXMgPSBmcmVlX2V4dGVudHM7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwkvKiB0aGVyZSBhcmUgdHdvIGNhc2VzIHdoaWNoIGNvdWxkIGNhdXNlIHVzIHRvIEVBR0FJTiBpbiB0aGUKKwkgKiB3ZS1uZWVkLW1vcmUtbWV0YWRhdGEgY2FzZToKKwkgKiAxKSB3ZSBoYXZlbid0IHJlc2VydmVkICphbnkqCisJICogMikgd2UgYXJlIHNvIGZyYWdtZW50ZWQsIHdlJ3ZlIG5lZWRlZCB0byBhZGQgbWV0YWRhdGEgdG9vCisJICogICAgbWFueSB0aW1lcy4gKi8KKwlpZiAoIWZyZWVfZXh0ZW50cyAmJiAhbWV0YV9hYykgeworCQltbG9nKDAsICJ3ZSBoYXZlbid0IHJlc2VydmVkIGFueSBtZXRhZGF0YSFcbiIpOworCQlzdGF0dXMgPSAtRUFHQUlOOworCQlyZWFzb24gPSBSRVNUQVJUX01FVEE7CisJCWdvdG8gbGVhdmU7CisJfSBlbHNlIGlmICgoIWZyZWVfZXh0ZW50cykKKwkJICAgJiYgKG9jZnMyX2FsbG9jX2NvbnRleHRfYml0c19sZWZ0KG1ldGFfYWMpCisJCSAgICAgICA8IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChldC0+ZXRfcm9vdF9lbCkpKSB7CisJCW1sb2coMCwgImZpbGVzeXN0ZW0gaXMgcmVhbGx5IGZyYWdtZW50ZWQuLi5cbiIpOworCQlzdGF0dXMgPSAtRUFHQUlOOworCQlyZWFzb24gPSBSRVNUQVJUX01FVEE7CisJCWdvdG8gbGVhdmU7CisJfQorCisJc3RhdHVzID0gX19vY2ZzMl9jbGFpbV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgZGF0YV9hYywgMSwKKwkJCQkJY2x1c3RlcnNfdG9fYWRkLCAmYml0X29mZiwgJm51bV9iaXRzKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJQlVHX09OKG51bV9iaXRzID4gY2x1c3RlcnNfdG9fYWRkKTsKKworCS8qIHJlc2VydmUgb3VyIHdyaXRlIGVhcmx5IC0tIGluc2VydF9leHRlbnQgbWF5IHVwZGF0ZSB0aGUgaW5vZGUgKi8KKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCWJsb2NrID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKG9zYi0+c2IsIGJpdF9vZmYpOworCW1sb2coMCwgIkFsbG9jYXRpbmcgJXUgY2x1c3RlcnMgYXQgYmxvY2sgJXUgZm9yIGlub2RlICVsbHVcbiIsCisJICAgICBudW1fYml0cywgYml0X29mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCXN0YXR1cyA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGlub2RlLCBldCwKKwkJCQkgICAgICpsb2dpY2FsX29mZnNldCwgYmxvY2ssCisJCQkJICAgICBudW1fYml0cywgZmxhZ3MsIG1ldGFfYWMpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZXQtPmV0X3Jvb3RfYmgpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwljbHVzdGVyc190b19hZGQgLT0gbnVtX2JpdHM7CisJKmxvZ2ljYWxfb2Zmc2V0ICs9IG51bV9iaXRzOworCisJaWYgKGNsdXN0ZXJzX3RvX2FkZCkgeworCQltbG9nKDAsICJuZWVkIHRvIGFsbG9jIG9uY2UgbW9yZSwgd2FudGVkID0gJXVcbiIsCisJCSAgICAgY2x1c3RlcnNfdG9fYWRkKTsKKwkJc3RhdHVzID0gLUVBR0FJTjsKKwkJcmVhc29uID0gUkVTVEFSVF9UUkFOUzsKKwl9CisKK2xlYXZlOgorCW1sb2dfZXhpdChzdGF0dXMpOworCWlmIChyZWFzb25fcmV0KQorCQkqcmVhc29uX3JldCA9IHJlYXNvbjsKKwlyZXR1cm4gc3RhdHVzOworfQorCiBzdGF0aWMgdm9pZCBvY2ZzMl9tYWtlX3JpZ2h0X3NwbGl0X3JlYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAogCQkJCSAgICAgICB1MzIgY3BvcywKQEAgLTQxOTIsNyArNDU5Niw3IEBACiBzdGF0aWMgaW50IG9jZnMyX3NwbGl0X2FuZF9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKLQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKIAkJCQkgIGludCBzcGxpdF9pbmRleCwKIAkJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpvcmlnX3NwbGl0X3JlYywKQEAgLTQyMDYsNyArNDYxMCw2IEBACiAJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgc3BsaXRfcmVjID0gKm9yaWdfc3BsaXRfcmVjOwogCXN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSBpbnNlcnQ7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAKIGxlZnRyaWdodDoKIAkvKgpAQCAtNDIxNSw4ICs0NjE4LDcgQEAKIAkgKi8KIAlyZWMgPSBwYXRoX2xlYWZfZWwocGF0aCktPmxfcmVjc1tzcGxpdF9pbmRleF07CiAKLQlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKLQlyaWdodG1vc3RfZWwgPSAmZGktPmlkMi5pX2xpc3Q7CisJcmlnaHRtb3N0X2VsID0gZXQtPmV0X3Jvb3RfZWw7CiAKIAlkZXB0aCA9IGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF90cmVlX2RlcHRoKTsKIAlpZiAoZGVwdGgpIHsKQEAgLTQyMjcsOCArNDYyOSw4IEBACiAKIAlpZiAobGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpID09CiAJICAgIGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkpIHsKLQkJcmV0ID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGRpX2JoLCAmZGVwdGgsIGxhc3RfZWJfYmgsCi0JCQkJICAgICAgbWV0YV9hYyk7CisJCXJldCA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBldCwKKwkJCQkgICAgICAmZGVwdGgsIGxhc3RfZWJfYmgsIG1ldGFfYWMpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTQyNjUsOCArNDY2Nyw3IEBACiAJCWRvX2xlZnRyaWdodCA9IDE7CiAJfQogCi0JcmV0ID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJnNwbGl0X3JlYywKLQkJCQkgICAgICZpbnNlcnQpOworCXJldCA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZXQsICZzcGxpdF9yZWMsICZpbnNlcnQpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTQzMDgsOCArNDcwOSw5IEBACiAgKiBvZiB0aGUgdHJlZSBpcyByZXF1aXJlZC4gQWxsIG90aGVyIGNhc2VzIHdpbGwgZGVncmFkZSBpbnRvIGEgbGVzcwogICogb3B0aW1hbCB0cmVlIGxheW91dC4KICAqCi0gKiBsYXN0X2ViX2JoIHNob3VsZCBiZSB0aGUgcmlnaHRtb3N0IGxlYWYgYmxvY2sgZm9yIGFueSBpbm9kZSB3aXRoIGEKLSAqIGJ0cmVlLiBTaW5jZSBhIHNwbGl0IG1heSBncm93IHRoZSB0cmVlIG9yIGEgbWVyZ2UgbWlnaHQgc2hyaW5rIGl0LCB0aGUgY2FsbGVyIGNhbm5vdCB0cnVzdCB0aGUgY29udGVudHMgb2YgdGhhdCBidWZmZXIgYWZ0ZXIgdGhpcyBjYWxsLgorICogbGFzdF9lYl9iaCBzaG91bGQgYmUgdGhlIHJpZ2h0bW9zdCBsZWFmIGJsb2NrIGZvciBhbnkgZXh0ZW50CisgKiBidHJlZS4gU2luY2UgYSBzcGxpdCBtYXkgZ3JvdyB0aGUgdHJlZSBvciBhIG1lcmdlIG1pZ2h0IHNocmluayBpdCwKKyAqIHRoZSBjYWxsZXIgY2Fubm90IHRydXN0IHRoZSBjb250ZW50cyBvZiB0aGF0IGJ1ZmZlciBhZnRlciB0aGlzIGNhbGwuCiAgKgogICogVGhpcyBjb2RlIGlzIG9wdGltaXplZCBmb3IgcmVhZGFiaWxpdHkgLSBzZXZlcmFsIHBhc3NlcyBtaWdodCBiZQogICogbWFkZSBvdmVyIGNlcnRhaW4gcG9ydGlvbnMgb2YgdGhlIHRyZWUuIEFsbCBvZiB0aG9zZSBibG9ja3Mgd2lsbApAQCAtNDMxNyw3ICs0NzE5LDcgQEAKICAqIGV4dHJhIG92ZXJoZWFkIGlzIG5vdCBleHByZXNzZWQgaW4gdGVybXMgb2YgZGlzayByZWFkcy4KICAqLwogc3RhdGljIGludCBfX29jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCiAJCQkJICAgICAgIGludCBzcGxpdF9pbmRleCwKQEAgLTQzNTcsMTEgKzQ3NTksOSBAQAogCSAqLwogCWlmIChwYXRoLT5wX3RyZWVfZGVwdGgpIHsKIAkJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7Ci0JCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwogCi0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCSAgICAgICBsZTY0X3RvX2NwdShkaS0+aV9sYXN0X2ViX2JsayksCi0JCQkJICAgICAgICZsYXN0X2ViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKGV0KSwKKwkJCQkgICAgICAgJmxhc3RfZWJfYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2V4aXQocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNDM5NCw3ICs0Nzk0LDcgQEAKIAkJaWYgKGN0eHQuY19zcGxpdF9jb3ZlcnNfcmVjKQogCQkJZWwtPmxfcmVjc1tzcGxpdF9pbmRleF0gPSAqc3BsaXRfcmVjOwogCQllbHNlCi0JCQlyZXQgPSBvY2ZzMl9zcGxpdF9hbmRfaW5zZXJ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRpX2JoLAorCQkJcmV0ID0gb2NmczJfc3BsaXRfYW5kX2luc2VydChpbm9kZSwgaGFuZGxlLCBwYXRoLCBldCwKIAkJCQkJCSAgICAgJmxhc3RfZWJfYmgsIHNwbGl0X2luZGV4LAogCQkJCQkJICAgICBzcGxpdF9yZWMsIG1ldGFfYWMpOwogCQlpZiAocmV0KQpAQCAtNDQwMiw3ICs0ODAyLDcgQEAKIAl9IGVsc2UgewogCQlyZXQgPSBvY2ZzMl90cnlfdG9fbWVyZ2VfZXh0ZW50KGlub2RlLCBoYW5kbGUsIHBhdGgsCiAJCQkJCQlzcGxpdF9pbmRleCwgc3BsaXRfcmVjLAotCQkJCQkJZGVhbGxvYywgJmN0eHQpOworCQkJCQkJZGVhbGxvYywgJmN0eHQsIGV0KTsKIAkJaWYgKHJldCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAl9CkBAIC00NDIwLDcgKzQ4MjAsOCBAQAogICoKICAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHBhc3NpbmcgZG93biBtZXRhX2FjIGlmIHdlJ2xsIG5lZWQgaXQuCiAgKi8KLWludCBvY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCitpbnQgb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsIHUzMiBjcG9zLCB1MzIgbGVuLCB1MzIgcGh5cywKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCkBAIC00NDQ2LDEwICs0ODQ3LDE0IEBACiAJLyoKIAkgKiBYWFg6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIHVwIHNvIHRoYXQgd2UganVzdCByZS1pbnNlcnQgdGhlCiAJICogbmV4dCBleHRlbnQgcmVjb3Jkcy4KKwkgKgorCSAqIFhYWDogVGhpcyBpcyBhIGhhY2sgb24gdGhlIGV4dGVudCB0cmVlLCBtYXliZSBpdCBzaG91bGQgYmUKKwkgKiBhbiBvcD8KIAkgKi8KLQlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCAwKTsKKwlpZiAoZXQtPmV0X29wcyA9PSAmb2NmczJfZGlub2RlX2V0X29wcykKKwkJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CiAKLQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChkaV9iaCk7CisJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsKTsKIAlpZiAoIWxlZnRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC00NDgwLDggKzQ4ODUsOSBAQAogCXNwbGl0X3JlYy5lX2ZsYWdzID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCktPmxfcmVjc1tpbmRleF0uZV9mbGFnczsKIAlzcGxpdF9yZWMuZV9mbGFncyAmPSB+T0NGUzJfRVhUX1VOV1JJVFRFTjsKIAotCXJldCA9IF9fb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihpbm9kZSwgZGlfYmgsIGhhbmRsZSwgbGVmdF9wYXRoLAotCQkJCQkgIGluZGV4LCAmc3BsaXRfcmVjLCBtZXRhX2FjLCBkZWFsbG9jKTsKKwlyZXQgPSBfX29jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oaW5vZGUsIGV0LCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJICBpbmRleCwgJnNwbGl0X3JlYywgbWV0YV9hYywKKwkJCQkJICBkZWFsbG9jKTsKIAlpZiAocmV0KQogCQltbG9nX2Vycm5vKHJldCk7CiAKQEAgLTQ0OTAsMTMgKzQ4OTYsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX3NwbGl0X3RyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKK3N0YXRpYyBpbnQgb2NmczJfc3BsaXRfdHJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAogCQkJICAgIGludCBpbmRleCwgdTMyIG5ld19yYW5nZSwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKIHsKIAlpbnQgcmV0LCBkZXB0aCwgY3JlZGl0cyA9IGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxhc3RfZWJfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRtb3N0X2VsLCAqZWw7CkBAIC00NTEzLDkgKzQ5MTgsOCBAQAogCiAJZGVwdGggPSBwYXRoLT5wX3RyZWVfZGVwdGg7CiAJaWYgKGRlcHRoID4gMCkgewotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkgICAgICAgbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspLAotCQkJCSAgICAgICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIG9jZnMyX2V0X2dldF9sYXN0X2ViX2JsayhldCksCisJCQkJICAgICAgICZsYXN0X2ViX2JoKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNDUyNiw3ICs0OTMwLDggQEAKIAl9IGVsc2UKIAkJcmlnaHRtb3N0X2VsID0gcGF0aF9sZWFmX2VsKHBhdGgpOwogCi0JY3JlZGl0cyArPSBwYXRoLT5wX3RyZWVfZGVwdGggKyBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZGkpOworCWNyZWRpdHMgKz0gcGF0aC0+cF90cmVlX2RlcHRoICsKKwkJICAgb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKGV0LT5ldF9yb290X2VsKTsKIAlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTQ1MzUsNyArNDk0MCw3IEBACiAKIAlpZiAobGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpID09CiAJICAgIGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkpIHsKLQkJcmV0ID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGRpX2JoLCAmZGVwdGgsICZsYXN0X2ViX2JoLAorCQlyZXQgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZXQsICZkZXB0aCwgJmxhc3RfZWJfYmgsCiAJCQkJICAgICAgbWV0YV9hYyk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTQ1NDksNyArNDk1NCw3IEBACiAJaW5zZXJ0Lmluc19zcGxpdCA9IFNQTElUX1JJR0hUOwogCWluc2VydC5pbnNfdHJlZV9kZXB0aCA9IGRlcHRoOwogCi0JcmV0ID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJnNwbGl0X3JlYywgJmluc2VydCk7CisJcmV0ID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBldCwgJnNwbGl0X3JlYywgJmluc2VydCk7CiAJaWYgKHJldCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC00NTYxLDcgKzQ5NjYsOCBAQAogc3RhdGljIGludCBvY2ZzMl90cnVuY2F0ZV9yZWMoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLCBpbnQgaW5kZXgsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKLQkJCSAgICAgIHUzMiBjcG9zLCB1MzIgbGVuKQorCQkJICAgICAgdTMyIGNwb3MsIHUzMiBsZW4sCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewogCWludCByZXQ7CiAJdTMyIGxlZnRfY3BvcywgcmVjX3JhbmdlLCB0cnVuY19yYW5nZTsKQEAgLTQ1NzMsNyArNDk3OSw3IEBACiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CiAKIAlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSAmJiBpbmRleCA+IDApIHsKLQkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkZWFsbG9jKTsKKwkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkZWFsbG9jLCBldCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNDcwNCw3ICs1MTEwLDcgQEAKIAogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX2xlYWZfYmgocGF0aCkpOwogCi0JcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkZWFsbG9jKTsKKwlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRlYWxsb2MsIGV0KTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC00NzE1LDcgKzUxMjEsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBvY2ZzMl9yZW1vdmVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCitpbnQgb2NmczJfcmVtb3ZlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCXUzMiBjcG9zLCB1MzIgbGVuLCBoYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCiAJCQlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKQEAgLTQ3MjQsMTEgKzUxMzEsMTEgQEAKIAl1MzIgcmVjX3JhbmdlLCB0cnVuY19yYW5nZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7Ci0Jc3RydWN0IG9jZnMyX3BhdGggKnBhdGg7CisJc3RydWN0IG9jZnMyX3BhdGggKnBhdGggPSBOVUxMOwogCiAJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CiAKLQlwYXRoID0gb2NmczJfbmV3X2lub2RlX3BhdGgoZGlfYmgpOworCXBhdGggPSBvY2ZzMl9uZXdfcGF0aChldC0+ZXRfcm9vdF9iaCwgZXQtPmV0X3Jvb3RfZWwpOwogCWlmICghcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC00NzgxLDEzICs1MTg4LDEzIEBACiAKIAlpZiAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpID09IGNwb3MgfHwgcmVjX3JhbmdlID09IHRydW5jX3JhbmdlKSB7CiAJCXJldCA9IG9jZnMyX3RydW5jYXRlX3JlYyhpbm9kZSwgaGFuZGxlLCBwYXRoLCBpbmRleCwgZGVhbGxvYywKLQkJCQkJIGNwb3MsIGxlbik7CisJCQkJCSBjcG9zLCBsZW4sIGV0KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9IGVsc2UgewotCQlyZXQgPSBvY2ZzMl9zcGxpdF90cmVlKGlub2RlLCBkaV9iaCwgaGFuZGxlLCBwYXRoLCBpbmRleCwKKwkJcmV0ID0gb2NmczJfc3BsaXRfdHJlZShpbm9kZSwgZXQsIGhhbmRsZSwgcGF0aCwgaW5kZXgsCiAJCQkJICAgICAgIHRydW5jX3JhbmdlLCBtZXRhX2FjKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNDgzNiw3ICs1MjQzLDcgQEAKIAkJfQogCiAJCXJldCA9IG9jZnMyX3RydW5jYXRlX3JlYyhpbm9kZSwgaGFuZGxlLCBwYXRoLCBpbmRleCwgZGVhbGxvYywKLQkJCQkJIGNwb3MsIGxlbik7CisJCQkJCSBjcG9zLCBsZW4sIGV0KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC01MTc5LDggKzU1ODYsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoLAotCQkJCSAgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlwdXQoaW5vZGUpOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01MjU1LDggKzU2NjEsNyBAQAogYmFpbDoKIAlpZiAodGxfaW5vZGUpCiAJCWlwdXQodGxfaW5vZGUpOwotCWlmICh0bF9iaCkKLQkJYnJlbHNlKHRsX2JoKTsKKwlicmVsc2UodGxfYmgpOwogCiAJaWYgKHN0YXR1cyA8IDAgJiYgKCp0bF9jb3B5KSkgewogCQlrZnJlZSgqdGxfY29weSk7CkBAIC01OTk5LDIwICs2NDA0LDEzIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBvY2ZzMl93cml0ZWJhY2tfemVyb19mdW5jKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCitzdGF0aWMgaW50IG9jZnMyX3plcm9fZnVuYyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9vcmRlcmVkX3plcm9fZnVuYyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQlyZXR1cm4gb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOwotfQotCiBzdGF0aWMgdm9pZCBvY2ZzMl9tYXBfYW5kX2RpcnR5X3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgdG8sCiAJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHplcm8sIHU2NCAqcGh5cykKQEAgLTYwMzEsMTcgKzY0MjksMTggQEAKIAkgKiBoZXJlIGlmIHRoZXkgYXJlbid0IC0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKCkKIAkgKiBtaWdodCd2ZSBza2lwcGVkIHNvbWUKIAkgKi8KLQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7Ci0JCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwKLQkJCQkJcGFnZV9idWZmZXJzKHBhZ2UpLAotCQkJCQlmcm9tLCB0bywgJnBhcnRpYWwsCi0JCQkJCW9jZnMyX29yZGVyZWRfemVyb19mdW5jKTsKLQkJaWYgKHJldCA8IDApCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JfSBlbHNlIHsKKwlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmZmVycyhwYWdlKSwKKwkJCQlmcm9tLCB0bywgJnBhcnRpYWwsCisJCQkJb2NmczJfemVyb19mdW5jKTsKKwlpZiAocmV0IDwgMCkKKwkJbWxvZ19lcnJubyhyZXQpOworCWVsc2UgaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQlyZXQgPSBvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CisjaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKIAkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksCiAJCQkJCWZyb20sIHRvLCAmcGFydGlhbCwKLQkJCQkJb2NmczJfd3JpdGViYWNrX3plcm9fZnVuYyk7CisJCQkJCW9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7CisjZW5kaWYKIAkJaWYgKHJldCA8IDApCiAJCQltbG9nX2Vycm5vKHJldCk7CiAJfQpAQCAtNjIwNiwyMCArNjYwNSwyOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG9jZnMyX3plcm9fZGlub2RlX2lkMihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSkKK3N0YXRpYyB2b2lkIG9jZnMyX3plcm9fZGlub2RlX2lkMl93aXRoX3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpCiB7CiAJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJdW5zaWduZWQgaW50IHhhdHRyc2l6ZSA9IGxlMTZfdG9fY3B1KGRpLT5pX3hhdHRyX2lubGluZV9zaXplKTsKIAotCW1lbXNldCgmZGktPmlkMiwgMCwgYmxvY2tzaXplIC0gb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyKSk7CisJaWYgKGxlMTZfdG9fY3B1KGRpLT5pX2R5bl9mZWF0dXJlcykgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpCisJCW1lbXNldCgmZGktPmlkMiwgMCwgYmxvY2tzaXplIC0KKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyKSAtCisJCQkJICAgIHhhdHRyc2l6ZSk7CisJZWxzZQorCQltZW1zZXQoJmRpLT5pZDIsIDAsIGJsb2Nrc2l6ZSAtCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlkMikpOwogfQogCiB2b2lkIG9jZnMyX2Rpbm9kZV9uZXdfZXh0ZW50X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpKQogewotCW9jZnMyX3plcm9fZGlub2RlX2lkMihpbm9kZSwgZGkpOworCW9jZnMyX3plcm9fZGlub2RlX2lkMl93aXRoX3hhdHRyKGlub2RlLCBkaSk7CiAJZGktPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoID0gMDsKIAlkaS0+aWQyLmlfbGlzdC5sX25leHRfZnJlZV9yZWMgPSAwOwotCWRpLT5pZDIuaV9saXN0LmxfY291bnQgPSBjcHVfdG9fbGUxNihvY2ZzMl9leHRlbnRfcmVjc19wZXJfaW5vZGUoaW5vZGUtPmlfc2IpKTsKKwlkaS0+aWQyLmlfbGlzdC5sX2NvdW50ID0gY3B1X3RvX2xlMTYoCisJCW9jZnMyX2V4dGVudF9yZWNzX3Blcl9pbm9kZV93aXRoX3hhdHRyKGlub2RlLT5pX3NiLCBkaSkpOwogfQogCiB2b2lkIG9jZnMyX3NldF9pbm9kZV9kYXRhX2lubGluZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSkKQEAgLTYyMzYsOSArNjY0NCwxMCBAQAogCSAqIFdlIGNsZWFyIHRoZSBlbnRpcmUgaV9kYXRhIHN0cnVjdHVyZSBoZXJlIHNvIHRoYXQgYWxsCiAJICogZmllbGRzIGNhbiBiZSBwcm9wZXJseSBpbml0aWFsaXplZC4KIAkgKi8KLQlvY2ZzMl96ZXJvX2Rpbm9kZV9pZDIoaW5vZGUsIGRpKTsKKwlvY2ZzMl96ZXJvX2Rpbm9kZV9pZDJfd2l0aF94YXR0cihpbm9kZSwgZGkpOwogCi0JaWRhdGEtPmlkX2NvdW50ID0gY3B1X3RvX2xlMTYob2NmczJfbWF4X2lubGluZV9kYXRhKGlub2RlLT5pX3NiKSk7CisJaWRhdGEtPmlkX2NvdW50ID0gY3B1X3RvX2xlMTYoCisJCQlvY2ZzMl9tYXhfaW5saW5lX2RhdGFfd2l0aF94YXR0cihpbm9kZS0+aV9zYiwgZGkpKTsKIH0KIAogaW50IG9jZnMyX2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtNjI1Myw2ICs2NjYyLDcgQEAKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CiAJbG9mZl90IGVuZCA9IG9zYi0+c19jbHVzdGVyc2l6ZTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKIAloYXNfZGF0YSA9IGlfc2l6ZV9yZWFkKGlub2RlKSA/IDEgOiAwOwogCkBAIC02MzUyLDcgKzY3NjIsOCBAQAogCQkgKiB0aGlzIHByb3ZlcyB0byBiZSBmYWxzZSwgd2UgY291bGQgYWx3YXlzIHJlLWJ1aWxkCiAJCSAqIHRoZSBpbi1pbm9kZSBkYXRhIGZyb20gb3VyIHBhZ2VzLgogCQkgKi8KLQkJcmV0ID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCBkaV9iaCk7CisJCXJldCA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGlub2RlLCAmZXQsCiAJCQkJCSAgMCwgYmxvY2ssIDEsIDAsIE5VTEwpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC02Mzk1LDEzICs2ODA2LDE0IEBACiAJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOwogCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZmVfYmgtPmJfZGF0YTsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJbmV3X2hpZ2hlc3RfY3BvcyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLAogCQkJCQkJICAgICBpX3NpemVfcmVhZChpbm9kZSkpOwogCi0JcGF0aCA9IG9jZnMyX25ld19pbm9kZV9wYXRoKGZlX2JoKTsKKwlwYXRoID0gb2NmczJfbmV3X3BhdGgoZmVfYmgsICZkaS0+aWQyLmlfbGlzdCk7CiAJaWYgKCFwYXRoKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTY1NzIsOCArNjk4NCw4IEBACiAJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJigqdGMpLT50Y19kZWFsbG9jKTsKIAogCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpIHsKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGxlNjRfdG9fY3B1KGZlLT5pX2xhc3RfZWJfYmxrKSwKLQkJCQkJICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxlNjRfdG9fY3B1KGZlLT5pX2xhc3RfZWJfYmxrKSwKKwkJCQkJICAmbGFzdF9lYl9iaCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC02Njg2LDggKzcwOTgsNyBAQAogCQltbG9nKE1MX05PVElDRSwKIAkJICAgICAiVHJ1bmNhdGUgY29tcGxldGlvbiBoYXMgbm9uLWVtcHR5IGRlYWxsb2MgY29udGV4dFxuIik7CiAKLQlpZiAodGMtPnRjX2xhc3RfZWJfYmgpCi0JCWJyZWxzZSh0Yy0+dGNfbGFzdF9lYl9iaCk7CisJYnJlbHNlKHRjLT50Y19sYXN0X2ViX2JoKTsKIAogCWtmcmVlKHRjKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmggYi9mcy9vY2ZzMi9hbGxvYy5oCmluZGV4IDYwY2QzZDUuLjcwMjU3YzggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmgKKysrIGIvZnMvb2NmczIvYWxsb2MuaApAQCAtMjYsMzAgKzI2LDEwMiBAQAogI2lmbmRlZiBPQ0ZTMl9BTExPQ19ICiAjZGVmaW5lIE9DRlMyX0FMTE9DX0gKIAorCisvKgorICogRm9yIHhhdHRyIHRyZWUgbGVhZiwgd2UgbGltaXQgdGhlIGxlYWYgYnl0ZSBzaXplIHRvIGJlIDY0Sy4KKyAqLworI2RlZmluZSBPQ0ZTMl9NQVhfWEFUVFJfVFJFRV9MRUFGX1NJWkUgNjU1MzYKKworLyoKKyAqIG9jZnMyX2V4dGVudF90cmVlIGFuZCBvY2ZzMl9leHRlbnRfdHJlZV9vcGVyYXRpb25zIGFyZSB1c2VkIHRvIGFic3RyYWN0CisgKiB0aGUgYi10cmVlIG9wZXJhdGlvbnMgaW4gb2NmczIuIE5vdyBhbGwgdGhlIGItdHJlZSBvcGVyYXRpb25zIGFyZSBub3QKKyAqIGxpbWl0ZWQgdG8gb2NmczJfZGlub2RlIG9ubHkuIEFueSBkYXRhIHdoaWNoIG5lZWQgdG8gYWxsb2NhdGUgY2x1c3RlcnMKKyAqIHRvIHN0b3JlIGNhbiB1c2UgYi10cmVlLiBBbmQgaXQgb25seSBuZWVkcyB0byBpbXBsZW1lbnQgaXRzIG9jZnMyX2V4dGVudF90cmVlCisgKiBhbmQgb3BlcmF0aW9uLgorICoKKyAqIG9jZnMyX2V4dGVudF90cmVlIGJlY29tZXMgdGhlIGZpcnN0LWNsYXNzIG9iamVjdCBmb3IgZXh0ZW50IHRyZWUKKyAqIG1hbmlwdWxhdGlvbi4gIENhbGxlcnMgb2YgdGhlIGFsbG9jLmMgY29kZSBuZWVkIHRvIGZpbGwgaXQgdmlhIG9uZSBvZgorICogdGhlIG9jZnMyX2luaXRfKl9leHRlbnRfdHJlZSgpIG9wZXJhdGlvbnMgYmVsb3cuCisgKgorICogb2NmczJfZXh0ZW50X3RyZWUgY29udGFpbnMgaW5mbyBmb3IgdGhlIHJvb3Qgb2YgdGhlIGItdHJlZSwgaXQgbXVzdCBoYXZlIGEKKyAqIHJvb3Qgb2NmczJfZXh0ZW50X2xpc3QgYW5kIGEgcm9vdF9iaCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gdGhlIGItdHJlZQorICogZnVuY3Rpb25zLgorICogb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucyBhYnN0cmFjdCB0aGUgbm9ybWFsIG9wZXJhdGlvbnMgd2UgZG8gZm9yCisgKiB0aGUgcm9vdCBvZiBleHRlbnQgYi10cmVlLgorICovCitzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9uczsKK3N0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSB7CisJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMJKmV0X29wczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJCQkqZXRfcm9vdF9iaDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QJCSpldF9yb290X2VsOworCXZvaWQJCQkJCSpldF9vYmplY3Q7CisJdW5zaWduZWQgaW50CQkJCWV0X21heF9sZWFmX2NsdXN0ZXJzOworfTsKKworLyoKKyAqIG9jZnMyX2luaXRfKl9leHRlbnRfdHJlZSgpIHdpbGwgZmlsbCBhbiBvY2ZzMl9leHRlbnRfdHJlZSBmcm9tIHRoZQorICogc3BlY2lmaWVkIG9iamVjdCBidWZmZXIuCisgKi8KK3ZvaWQgb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwordm9pZCBvY2ZzMl9pbml0X3hhdHRyX3RyZWVfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Cit2b2lkIG9jZnMyX2luaXRfeGF0dHJfdmFsdWVfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkJc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2KTsKKwogc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQ7CiBpbnQgb2NmczJfaW5zZXJ0X2V4dGVudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCWhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKKwkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQl1MzIgY3BvcywKIAkJCXU2NCBzdGFydF9ibGssCiAJCQl1MzIgbmV3X2NsdXN0ZXJzLAogCQkJdTggZmxhZ3MsCiAJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyk7CisKK2VudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHsKKwlSRVNUQVJUX05PTkUgPSAwLAorCVJFU1RBUlRfVFJBTlMsCisJUkVTVEFSVF9NRVRBCit9OworaW50IG9jZnMyX2FkZF9jbHVzdGVyc19pbl9idHJlZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXUzMiAqbG9naWNhbF9vZmZzZXQsCisJCQkJdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQlpbnQgbWFya191bndyaXR0ZW4sCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KTsKIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0OwotaW50IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKK2ludCBvY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwgdTMyIGNwb3MsIHUzMiBsZW4sIHUzMiBwaHlzLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYyk7Ci1pbnQgb2NmczJfcmVtb3ZlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAoraW50IG9jZnMyX3JlbW92ZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQl1MzIgY3BvcywgdTMyIGxlbiwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpOwogaW50IG9jZnMyX251bV9mcmVlX2V4dGVudHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUpOwotLyogaG93IG1hbnkgbmV3IG1ldGFkYXRhIGNodW5rcyB3b3VsZCBhbiBhbGxvY2F0aW9uIG5lZWQgYXQgbWF4aW11bT8gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSkKKwkJCSAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpOworCisvKgorICogaG93IG1hbnkgbmV3IG1ldGFkYXRhIGNodW5rcyB3b3VsZCBhbiBhbGxvY2F0aW9uIG5lZWQgYXQgbWF4aW11bT8KKyAqCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCByb290X2VsIGlzIHRoZSByb290CisgKiBvZiBleHRlbnQgdHJlZS4gU28gZm9yIGFuIGlub2RlLCBpdCBzaG91bGQgYmUgJmZlLT5pZDIuaV9saXN0LiBPdGhlcndpc2UKKyAqIHRoZSByZXN1bHQgbWF5IGJlIHdyb25nLgorICovCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyb290X2VsKQogewogCS8qCiAJICogUmF0aGVyIHRoYW4gZG8gYWxsIHRoZSB3b3JrIG9mIGRldGVybWluaW5nIGhvdyBtdWNoIHdlIG5lZWQKQEAgLTU5LDcgKzEzMSw3IEBACiAJICogbmV3IHRyZWVfZGVwdGg9PTAgZXh0ZW50X2Jsb2NrLCBhbmQgb25lIGJsb2NrIGF0IHRoZSBuZXcKIAkgKiB0b3Atb2YtdGhlIHRyZWUuCiAJICovCi0JcmV0dXJuIGxlMTZfdG9fY3B1KGZlLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCkgKyAyOworCXJldHVybiBsZTE2X3RvX2NwdShyb290X2VsLT5sX3RyZWVfZGVwdGgpICsgMjsKIH0KIAogdm9pZCBvY2ZzMl9kaW5vZGVfbmV3X2V4dGVudF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCBhNTNkYTE0Li5jMjI1NDNiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC02OCw5ICs2OCw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkgIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJCQkgICZiaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtMTI4LDggKzEyNiw3IEBACiAJZXJyID0gMDsKIAogYmFpbDoKLQlpZiAoYmgpCi0JCWJyZWxzZShiaCk7CisJYnJlbHNlKGJoKTsKIAogCW1sb2dfZXhpdChlcnIpOwogCXJldHVybiBlcnI7CkBAIC0yNjEsMTMgKzI1OCwxMSBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAKIAlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCUJVR19PTighKE9DRlMyX0koaW5vZGUpLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkpOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmRpX2JoLAotCQkJICAgICAgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmRpX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC00ODUsMTEgKzQ4MCwxNCBAQAogCX0KIAogCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKKwkJcmV0ID0gb2NmczJfamJkMl9maWxlX2lub2RlKGhhbmRsZSwgaW5vZGUpOworI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECiAJCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwKIAkJCQkJcGFnZV9idWZmZXJzKHBhZ2UpLAogCQkJCQlmcm9tLCB0bywgTlVMTCwKIAkJCQkJb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKLQkJaWYgKHJldCA8IDApIAorI2VuZGlmCisJCWlmIChyZXQgPCAwKQogCQkJbWxvZ19lcnJubyhyZXQpOwogCX0KIG91dDoKQEAgLTY2OSw3ICs2NjcsNyBAQAogewogCWpvdXJuYWxfdCAqam91cm5hbCA9IE9DRlMyX1NCKHBhZ2UtPm1hcHBpbmctPmhvc3QtPmlfc2IpLT5qb3VybmFsLT5qX2pvdXJuYWw7CiAKLQlqb3VybmFsX2ludmFsaWRhdGVwYWdlKGpvdXJuYWwsIHBhZ2UsIG9mZnNldCk7CisJamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlKGpvdXJuYWwsIHBhZ2UsIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IHdhaXQpCkBAIC02NzgsNyArNjc2LDcgQEAKIAogCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLCB3YWl0KTsKKwlyZXR1cm4gamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwgd2FpdCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9jZnMyX2RpcmVjdF9JTyhpbnQgcncsCkBAIC0xMDc0LDExICsxMDcyLDE1IEBACiAJCXRtcHBhZ2UgPSB3Yy0+d19wYWdlc1tpXTsKIAogCQlpZiAocGFnZV9oYXNfYnVmZmVycyh0bXBwYWdlKSkgewotCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKKwkJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKKwkJCQlvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUod2MtPndfaGFuZGxlLCBpbm9kZSk7CisjaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKIAkJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsCiAJCQkJCQkgIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKIAkJCQkJCSAgZnJvbSwgdG8sIE5VTEwsCiAJCQkJCQkgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7CisjZW5kaWYKKwkJCX0KIAogCQkJYmxvY2tfY29tbWl0X3dyaXRlKHRtcHBhZ2UsIGZyb20sIHRvKTsKIAkJfQpAQCAtMTI0Miw2ICsxMjQ0LDcgQEAKIAlpbnQgcmV0LCBpLCBuZXcsIHNob3VsZF96ZXJvID0gMDsKIAl1NjQgdl9ibGtubywgcF9ibGtubzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKIAluZXcgPSBwaHlzID09IDAgPyAxIDogMDsKIAlpZiAobmV3IHx8IHVud3JpdHRlbikKQEAgLTEyNTUsMTAgKzEyNTgsMTAgQEAKIAkJICogYW55IGFkZGl0aW9uYWwgc2VtYXBob3JlcyBvciBjbHVzdGVyIGxvY2tzLgogCQkgKi8KIAkJdG1wX3BvcyA9IGNwb3M7Ci0JCXJldCA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaW5vZGUsCi0JCQkJCQkgJnRtcF9wb3MsIDEsIDAsIHdjLT53X2RpX2JoLAotCQkJCQkJIHdjLT53X2hhbmRsZSwgZGF0YV9hYywKLQkJCQkJCSBtZXRhX2FjLCBOVUxMKTsKKwkJcmV0ID0gb2NmczJfYWRkX2lub2RlX2RhdGEoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZSwKKwkJCQkJICAgJnRtcF9wb3MsIDEsIDAsIHdjLT53X2RpX2JoLAorCQkJCQkgICB3Yy0+d19oYW5kbGUsIGRhdGFfYWMsCisJCQkJCSAgIG1ldGFfYWMsIE5VTEwpOwogCQkvKgogCQkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSB3ZSBtdXN0IGhhdmUgYWxyZWFkeQogCQkgKiBjYWxjdWxhdGVkIHRoZSBjb3JyZWN0IG1ldGEgZGF0YSBhbGxvY2F0aW9uIHJlcXVpcmVkLiBUaGUKQEAgLTEyNzYsNyArMTI3OSw4IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCX0gZWxzZSBpZiAodW53cml0dGVuKSB7Ci0JCXJldCA9IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oaW5vZGUsIHdjLT53X2RpX2JoLAorCQlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCB3Yy0+d19kaV9iaCk7CisJCXJldCA9IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oaW5vZGUsICZldCwKIAkJCQkJCXdjLT53X2hhbmRsZSwgY3BvcywgMSwgcGh5cywKIAkJCQkJCW1ldGFfYWMsICZ3Yy0+d19kZWFsbG9jKTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTE2NjUsNiArMTY2OSw3IEBACiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKIAloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKIAogCXJldCA9IG9jZnMyX2FsbG9jX3dyaXRlX2N0eHQoJndjLCBvc2IsIHBvcywgbGVuLCBkaV9iaCk7CiAJaWYgKHJldCkgewpAQCAtMTcxMiwxNCArMTcxNywyMyBAQAogCQkgKiBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoKS4gSXQgZ3JlYXRseSBvdmVyLWVzdGltYXRlcwogCQkgKiB0aGUgd29yayB0byBiZSBkb25lLgogCQkgKi8KLQkJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBkaSwgY2x1c3RlcnNfdG9fYWxsb2MsCi0JCQkJCSAgICBleHRlbnRzX3RvX3NwbGl0LCAmZGF0YV9hYywgJm1ldGFfYWMpOworCQltbG9nKDAsICJleHRlbmQgaW5vZGUgJWxsdSwgaV9zaXplID0gJWxsZCwgZGktPmlfY2x1c3RlcnMgPSAldSwiCisJCSAgICAgIiBjbHVzdGVyc190b19hZGQgPSAldSwgZXh0ZW50c190b19zcGxpdCA9ICV1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkgICAgIChsb25nIGxvbmcpaV9zaXplX3JlYWQoaW5vZGUpLCBsZTMyX3RvX2NwdShkaS0+aV9jbHVzdGVycyksCisJCSAgICAgY2x1c3RlcnNfdG9fYWxsb2MsIGV4dGVudHNfdG9fc3BsaXQpOworCisJCW9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHdjLT53X2RpX2JoKTsKKwkJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsCisJCQkJCSAgICBjbHVzdGVyc190b19hbGxvYywgZXh0ZW50c190b19zcGxpdCwKKwkJCQkJICAgICZkYXRhX2FjLCAmbWV0YV9hYyk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoaW5vZGUtPmlfc2IsIGRpLAorCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAgICAmZGktPmlkMi5pX2xpc3QsCiAJCQkJCQkgICAgY2x1c3RlcnNfdG9fYWxsb2MpOwogCiAJfQpAQCAtMTkwNSwxMSArMTkxOSwxNSBAQAogCQl9CiAKIAkJaWYgKHBhZ2VfaGFzX2J1ZmZlcnModG1wcGFnZSkpIHsKLQkJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCisJCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7CisJCQkJb2NmczJfamJkMl9maWxlX2lub2RlKHdjLT53X2hhbmRsZSwgaW5vZGUpOworI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECiAJCQkJd2Fsa19wYWdlX2J1ZmZlcnMod2MtPndfaGFuZGxlLAogCQkJCQkJICBwYWdlX2J1ZmZlcnModG1wcGFnZSksCiAJCQkJCQkgIGZyb20sIHRvLCBOVUxMLAogCQkJCQkJICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOworI2VuZGlmCisJCQl9CiAJCQlibG9ja19jb21taXRfd3JpdGUodG1wcGFnZSwgZnJvbSwgdG8pOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uYyBiL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmMKaW5kZXggZjEzNjYzOS4uN2U5NDdjNiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uYworKysgYi9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5jCkBAIC02Niw3ICs2Niw3IEBACiAJLyogcmVtb3ZlIGZyb20gZGlydHkgbGlzdCBiZWZvcmUgSS9PLiAqLwogCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CiAKLQlnZXRfYmgoYmgpOyAvKiBmb3IgZW5kX2J1ZmZlcl93cml0ZV9zeW5jKCkgKi8gICAgICAgICAgICAgICAgICAgCisJZ2V0X2JoKGJoKTsgLyogZm9yIGVuZF9idWZmZXJfd3JpdGVfc3luYygpICovCiAJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOwogCXN1Ym1pdF9iaChXUklURSwgYmgpOwogCkBAIC04OCwyMiArODgsMTAzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG9jZnMyX3JlYWRfYmxvY2tzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCB1NjQgYmxvY2ssIGludCBuciwKLQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSwgaW50IGZsYWdzLAotCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoraW50IG9jZnMyX3JlYWRfYmxvY2tzX3N5bmMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHU2NCBibG9jaywKKwkJCSAgIHVuc2lnbmVkIGludCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSkKIHsKIAlpbnQgc3RhdHVzID0gMDsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlpZiAoIW5yKSB7CisJCW1sb2coTUxfQkhfSU8sICJObyBidWZmZXJzIHdpbGwgYmUgcmVhZCFcbiIpOworCQlnb3RvIGJhaWw7CisJfQorCisJZm9yIChpID0gMCA7IGkgPCBuciA7IGkrKykgeworCQlpZiAoYmhzW2ldID09IE5VTEwpIHsKKwkJCWJoc1tpXSA9IHNiX2dldGJsayhvc2ItPnNiLCBibG9jaysrKTsKKwkJCWlmIChiaHNbaV0gPT0gTlVMTCkgeworCQkJCXN0YXR1cyA9IC1FSU87CisJCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCQliaCA9IGJoc1tpXTsKKworCQlpZiAoYnVmZmVyX2piZChiaCkpIHsKKwkJCW1sb2coTUxfRVJST1IsCisJCQkgICAgICJ0cnlpbmcgdG8gc3luYyByZWFkIGEgamJkICIKKwkJCSAgICAgIm1hbmFnZWQgYmggKGJsb2NrbnIgPSAlbGx1KSwgc2tpcHBpbmdcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQkvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIEJVRywgb3IKKwkJCSAqIGF0IGxlYXN0IHJldHVybiBhbiBlcnJvci4gKi8KKwkJCW1sb2coTUxfRVJST1IsCisJCQkgICAgICJ0cnlpbmcgdG8gc3luYyByZWFkIGEgZGlydHkgIgorCQkJICAgICAiYnVmZmVyISAoYmxvY2tuciA9ICVsbHUpLCBza2lwcGluZ1xuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbG9ja19idWZmZXIoYmgpOworCQlpZiAoYnVmZmVyX2piZChiaCkpIHsKKwkJCW1sb2coTUxfRVJST1IsCisJCQkgICAgICJibG9jayAlbGx1IGhhZCB0aGUgSkJEIGJpdCBzZXQgIgorCQkJICAgICAid2hpbGUgSSB3YXMgaW4gbG9ja19idWZmZXIhIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJCUJVRygpOworCQl9CisKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJZ2V0X2JoKGJoKTsgLyogZm9yIGVuZF9idWZmZXJfcmVhZF9zeW5jKCkgKi8KKwkJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl9yZWFkX3N5bmM7CisJCXN1Ym1pdF9iaChSRUFELCBiaCk7CisJfQorCisJZm9yIChpID0gbnI7IGkgPiAwOyBpLS0pIHsKKwkJYmggPSBiaHNbaSAtIDFdOworCisJCWlmIChidWZmZXJfamJkKGJoKSkgeworCQkJbWxvZyhNTF9FUlJPUiwKKwkJCSAgICAgInRoZSBqb3VybmFsIGdvdCB0aGUgYnVmZmVyIHdoaWxlIGl0IHdhcyAiCisJCQkgICAgICJsb2NrZWQgZm9yIGlvISAoYmxvY2tuciA9ICVsbHUpXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCQkJQlVHKCk7CisJCX0KKworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJLyogU3RhdHVzIHdvbid0IGJlIGNsZWFyZWQgZnJvbSBoZXJlIG9uIG91dCwKKwkJCSAqIHNvIHdlIGNhbiBzYWZlbHkgcmVjb3JkIHRoaXMgYW5kIGxvb3AgYmFjaworCQkJICogdG8gY2xlYW51cCB0aGUgb3RoZXIgYnVmZmVycy4gKi8KKwkJCXN0YXR1cyA9IC1FSU87CisJCQlwdXRfYmgoYmgpOworCQkJYmhzW2kgLSAxXSA9IE5VTEw7CisJCX0KKwl9CisKK2JhaWw6CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IG9jZnMyX3JlYWRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBibG9jaywgaW50IG5yLAorCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLCBpbnQgZmxhZ3MpCit7CisJaW50IHN0YXR1cyA9IDA7CiAJaW50IGksIGlnbm9yZV9jYWNoZSA9IDA7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAotCW1sb2dfZW50cnkoIihibG9jaz0oJWxsdSksIG5yPSglZCksIGZsYWdzPSVkLCBpbm9kZT0lcClcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssIG5yLCBmbGFncywgaW5vZGUpOworCW1sb2dfZW50cnkoIihpbm9kZT0lcCwgYmxvY2s9KCVsbHUpLCBucj0oJWQpLCBmbGFncz0lZClcbiIsCisJCSAgIGlub2RlLCAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrLCBuciwgZmxhZ3MpOwogCisJQlVHX09OKCFpbm9kZSk7CiAJQlVHX09OKChmbGFncyAmIE9DRlMyX0JIX1JFQURBSEVBRCkgJiYKLQkgICAgICAgKCFpbm9kZSB8fCAhKGZsYWdzICYgT0NGUzJfQkhfQ0FDSEVEKSkpOworCSAgICAgICAoZmxhZ3MgJiBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpKTsKIAotCWlmIChvc2IgPT0gTlVMTCB8fCBvc2ItPnNiID09IE5VTEwgfHwgYmhzID09IE5VTEwpIHsKKwlpZiAoYmhzID09IE5VTEwpIHsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xMjIsMjYgKzIwMywxOSBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc2IgPSBvc2ItPnNiOwotCi0JaWYgKGZsYWdzICYgT0NGUzJfQkhfQ0FDSEVEICYmICFpbm9kZSkKLQkJZmxhZ3MgJj0gfk9DRlMyX0JIX0NBQ0hFRDsKLQotCWlmIChpbm9kZSkKLQkJbXV0ZXhfbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2lvX211dGV4KTsKKwltdXRleF9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfaW9fbXV0ZXgpOwogCWZvciAoaSA9IDAgOyBpIDwgbnIgOyBpKyspIHsKIAkJaWYgKGJoc1tpXSA9PSBOVUxMKSB7Ci0JCQliaHNbaV0gPSBzYl9nZXRibGsoc2IsIGJsb2NrKyspOworCQkJYmhzW2ldID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibG9jaysrKTsKIAkJCWlmIChiaHNbaV0gPT0gTlVMTCkgewotCQkJCWlmIChpbm9kZSkKLQkJCQkJbXV0ZXhfdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfaW9fbXV0ZXgpOworCQkJCW11dGV4X3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2lvX211dGV4KTsKIAkJCQlzdGF0dXMgPSAtRUlPOwogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCQlnb3RvIGJhaWw7CiAJCQl9CiAJCX0KIAkJYmggPSBiaHNbaV07Ci0JCWlnbm9yZV9jYWNoZSA9IDA7CisJCWlnbm9yZV9jYWNoZSA9IChmbGFncyAmIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CiAKIAkJLyogVGhlcmUgYXJlIHRocmVlIHJlYWQtYWhlYWQgY2FzZXMgaGVyZSB3aGljaCB3ZSBuZWVkIHRvCiAJCSAqIGJlIGNvbmNlcm5lZCB3aXRoLiBBbGwgdGhyZWUgYXNzdW1lIGEgYnVmZmVyIGhhcwpAQCAtMTY3LDI2ICsyNDEsMjcgQEAKIAkJICogICAgYmVmb3JlIG91ciBpcy1pdC1pbi1mbGlnaHQgY2hlY2suCiAJCSAqLwogCi0JCWlmIChmbGFncyAmIE9DRlMyX0JIX0NBQ0hFRCAmJgotCQkgICAgIW9jZnMyX2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgYmgpKSB7CisJCWlmICghaWdub3JlX2NhY2hlICYmICFvY2ZzMl9idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGJoKSkgewogCQkJbWxvZyhNTF9VUFRPREFURSwKIAkJCSAgICAgImJoICglbGx1KSwgaW5vZGUgJWxsdSBub3QgdXB0b2RhdGVcbiIsCiAJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKIAkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCQkJLyogV2UncmUgdXNpbmcgaWdub3JlX2NhY2hlIGhlcmUgdG8gc2F5CisJCQkgKiAiZ28gdG8gZGlzayIgKi8KIAkJCWlnbm9yZV9jYWNoZSA9IDE7CiAJCX0KIAogCQkvKiBYWFg6IENhbiB3ZSBldmVyIGdldCB0aGlzIGFuZCAqbm90KiBoYXZlIHRoZSBjYWNoZWQKIAkJICogZmxhZyBzZXQ/ICovCiAJCWlmIChidWZmZXJfamJkKGJoKSkgewotCQkJaWYgKCEoZmxhZ3MgJiBPQ0ZTMl9CSF9DQUNIRUQpIHx8IGlnbm9yZV9jYWNoZSkKKwkJCWlmIChpZ25vcmVfY2FjaGUpCiAJCQkJbWxvZyhNTF9CSF9JTywgInRyeWluZyB0byBzeW5jIHJlYWQgYSBqYmQgIgogCQkJCQkgICAgICAgIm1hbmFnZWQgYmggKGJsb2NrbnIgPSAlbGx1KVxuIiwKIAkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICghKGZsYWdzICYgT0NGUzJfQkhfQ0FDSEVEKSB8fCBpZ25vcmVfY2FjaGUpIHsKKwkJaWYgKGlnbm9yZV9jYWNoZSkgewogCQkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKIAkJCQkvKiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIEJVRywgb3IKIAkJCQkgKiBhdCBsZWFzdCByZXR1cm4gYW4gZXJyb3IuICovCkBAIC0yMjEsNyArMjk2LDcgQEAKIAkJCSAqIHByZXZpb3VzbHkgcmVhZC1haGVhZCBidWZmZXIgbWF5IGhhdmUKIAkJCSAqIGNvbXBsZXRlZCBJL08gd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIGZvciB0aGUKIAkJCSAqIGJ1ZmZlciBsb2NrLiAqLwotCQkJaWYgKChmbGFncyAmIE9DRlMyX0JIX0NBQ0hFRCkKKwkJCWlmICghKGZsYWdzICYgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKQogCQkJICAgICYmICEoZmxhZ3MgJiBPQ0ZTMl9CSF9SRUFEQUhFQUQpCiAJCQkgICAgJiYgb2NmczJfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBiaCkpIHsKIAkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKQEAgLTI2NSwxNSArMzQwLDE0IEBACiAJCS8qIEFsd2F5cyBzZXQgdGhlIGJ1ZmZlciBpbiB0aGUgY2FjaGUsIGV2ZW4gaWYgaXQgd2FzCiAJCSAqIGEgZm9yY2VkIHJlYWQsIG9yIHJlYWQtYWhlYWQgd2hpY2ggaGFzbid0IHlldAogCQkgKiBjb21wbGV0ZWQuICovCi0JCWlmIChpbm9kZSkKLQkJCW9jZnMyX3NldF9idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGJoKTsKKwkJb2NmczJfc2V0X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgYmgpOwogCX0KLQlpZiAoaW5vZGUpCi0JCW11dGV4X3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2lvX211dGV4KTsKKwltdXRleF91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9pb19tdXRleCk7CiAKIAltbG9nKE1MX0JIX0lPLCAiYmxvY2s9KCVsbHUpLCBucj0oJWQpLCBjYWNoZWQ9JXMsIGZsYWdzPTB4JXhcbiIsIAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jaywgbnIsCi0JICAgICAoIShmbGFncyAmIE9DRlMyX0JIX0NBQ0hFRCkgfHwgaWdub3JlX2NhY2hlKSA/ICJubyIgOiAieWVzIiwgZmxhZ3MpOworCSAgICAgKChmbGFncyAmIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSkgfHwgaWdub3JlX2NhY2hlKSA/ICJubyIgOiAieWVzIiwKKwkgICAgIGZsYWdzKTsKIAogYmFpbDoKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uaCBiL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmgKaW5kZXggYzJlNzg2MS4uNzVlMWRjYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uaAorKysgYi9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5oCkBAIC0zMSwzMSArMzEsMjkgQEAKIHZvaWQgb2NmczJfZW5kX2J1ZmZlcl9pb19zeW5jKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkgICAgIGludCB1cHRvZGF0ZSk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3JlYWRfYmxvY2soc3RydWN0IG9jZnMyX3N1cGVyICAgICAgICAgICpvc2IsCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZWFkX2Jsb2NrKHN0cnVjdCBpbm9kZQkgICAgICAgKmlub2RlLAogCQkJCSAgIHU2NCAgICAgICAgICAgICAgICAgIG9mZiwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKLQkJCQkgICBpbnQgICAgICAgICAgICAgICAgICBmbGFncywKLQkJCQkgICBzdHJ1Y3QgaW5vZGUgICAgICAgICppbm9kZSk7CisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpOwogCiBpbnQgb2NmczJfd3JpdGVfYmxvY2soc3RydWN0IG9jZnMyX3N1cGVyICAgICAgICAgICpvc2IsCiAJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKmJoLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgICAgICAgICppbm9kZSk7Ci1pbnQgb2NmczJfcmVhZF9ibG9ja3Moc3RydWN0IG9jZnMyX3N1cGVyICAgICAgICAgICpvc2IsCitpbnQgb2NmczJfcmVhZF9ibG9ja3Moc3RydWN0IGlub2RlCSAgKmlub2RlLAogCQkgICAgICB1NjQgICAgICAgICAgICAgICAgICBibG9jaywKIAkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgbnIsCiAJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKmJoc1tdLAotCQkgICAgICBpbnQgICAgICAgICAgICAgICAgICBmbGFncywKLQkJICAgICAgc3RydWN0IGlub2RlICAgICAgICAqaW5vZGUpOworCQkgICAgICBpbnQgICAgICAgICAgICAgICAgICBmbGFncyk7CitpbnQgb2NmczJfcmVhZF9ibG9ja3Nfc3luYyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgdTY0IGJsb2NrLAorCQkJICAgdW5zaWduZWQgaW50IG5yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdKTsKIAogaW50IG9jZnMyX3dyaXRlX3N1cGVyX29yX2JhY2t1cChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAotI2RlZmluZSBPQ0ZTMl9CSF9DQUNIRUQgICAgICAgICAgICAxCisjZGVmaW5lIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSAgICAgIDEKICNkZWZpbmUgT0NGUzJfQkhfUkVBREFIRUFEICAgICAgICAgOAogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZWFkX2Jsb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAqIG9zYiwgdTY0IG9mZiwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwgaW50IGZsYWdzLAotCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZWFkX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBvZmYsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAKQEAgLTY1LDggKzYzLDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKG9zYiwgb2ZmLCAxLCBiaCwKLQkJCQkgICBmbGFncywgaW5vZGUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBvZmYsIDEsIGJoLCAwKTsKIAogYmFpbDoKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuYwppbmRleCAyM2M3MzJmLi5kOGEwY2I5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuYwpAQCAtMTA5LDYgKzEwOSw3IEBACiAJZGVmaW5lX21hc2soQ09OTiksCiAJZGVmaW5lX21hc2soUVVPUlVNKSwKIAlkZWZpbmVfbWFzayhFWFBPUlQpLAorCWRlZmluZV9tYXNrKFhBVFRSKSwKIAlkZWZpbmVfbWFzayhFUlJPUiksCiAJZGVmaW5lX21hc2soTk9USUNFKSwKIAlkZWZpbmVfbWFzayhLVEhSRUFEKSwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5oIGIvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmgKaW5kZXggNTk3ZTA2NC4uNTc2NzBjNiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmgKQEAgLTExMiw2ICsxMTIsNyBAQAogI2RlZmluZSBNTF9DT05OCQkweDAwMDAwMDAwMDQwMDAwMDBVTEwgLyogbmV0IGNvbm5lY3Rpb24gbWFuYWdlbWVudCAqLwogI2RlZmluZSBNTF9RVU9SVU0JMHgwMDAwMDAwMDA4MDAwMDAwVUxMIC8qIG5ldCBjb25uZWN0aW9uIHF1b3J1bSAqLwogI2RlZmluZSBNTF9FWFBPUlQJMHgwMDAwMDAwMDEwMDAwMDAwVUxMIC8qIG9jZnMyIGV4cG9ydCBvcGVyYXRpb25zICovCisjZGVmaW5lIE1MX1hBVFRSCTB4MDAwMDAwMDAyMDAwMDAwMFVMTCAvKiBvY2ZzMiBleHRlbmRlZCBhdHRyaWJ1dGVzICovCiAvKiBiaXRzIHRoYXQgYXJlIGluZnJlcXVlbnRseSBnaXZlbiBhbmQgZnJlcXVlbnRseSBtYXRjaGVkIGluIHRoZSBoaWdoIHdvcmQgKi8KICNkZWZpbmUgTUxfRVJST1IJMHgwMDAwMDAwMTAwMDAwMDAwVUxMIC8qIHNlbnQgdG8gS0VSTl9FUlIgKi8KICNkZWZpbmUgTUxfTk9USUNFCTB4MDAwMDAwMDIwMDAwMDAwMFVMTCAvKiBzZXRuIHRvIEtFUk5fTk9USUNFICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kaXIuYyBiL2ZzL29jZnMyL2Rpci5jCmluZGV4IDljY2U1NjMuLjAyNmU2ZWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2Rpci5jCisrKyBiL2ZzL29jZnMyL2Rpci5jCkBAIC04Miw2ICs4Miw0OSBAQAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKm5ld19iaCk7CiAKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9jZnMyX2JyZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIGludCBibG9jaywgaW50ICplcnIsIGludCByZWFkYSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgdG1wZXJyOworCXU2NCBwX2Jsa25vOworCWludCByZWFkZmxhZ3MgPSAwOworCisJaWYgKHJlYWRhKQorCQlyZWFkZmxhZ3MgfD0gT0NGUzJfQkhfUkVBREFIRUFEOworCisJaWYgKCgodTY0KWJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA+PQorCSAgICBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJQlVHX09OKCFyZWFkYSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRvd25fcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJdG1wZXJyID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBibG9jaywgJnBfYmxrbm8sIE5VTEwsCisJCQkJCSAgICAgTlVMTCk7CisJdXBfcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJaWYgKHRtcGVyciA8IDApIHsKKwkJbWxvZ19lcnJubyh0bXBlcnIpOworCQlnb3RvIGZhaWw7CisJfQorCisJdG1wZXJyID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIHBfYmxrbm8sIDEsICZiaCwgcmVhZGZsYWdzKTsKKwlpZiAodG1wZXJyIDwgMCkKKwkJZ290byBmYWlsOworCisJdG1wZXJyID0gMDsKKworCSplcnIgPSAwOworCXJldHVybiBiaDsKKworZmFpbDoKKwlicmVsc2UoYmgpOworCWJoID0gTlVMTDsKKworCSplcnIgPSAtRUlPOworCXJldHVybiBOVUxMOworfQorCiAvKgogICogYmggcGFzc2VkIGhlcmUgY2FuIGJlIGFuIGlub2RlIGJsb2NrIG9yIGEgZGlyIGRhdGEgYmxvY2ssIGRlcGVuZGluZwogICogb24gdGhlIGlub2RlIGlubGluZSBkYXRhIGZsYWcuCkBAIC0xODgsOCArMjMxLDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAlzdHJ1Y3Qgb2NmczJfaW5saW5lX2RhdGEgKmRhdGE7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGRpci0+aV9zYiksIE9DRlMyX0koZGlyKS0+aXBfYmxrbm8sCi0JCQkgICAgICAgJmRpX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGRpcik7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhkaXIsIE9DRlMyX0koZGlyKS0+aXBfYmxrbm8sICZkaV9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMjYwLDE0ICszMDIsMTMgQEAKIAkJfQogCQlpZiAoKGJoID0gYmhfdXNlW3JhX3B0cisrXSkgPT0gTlVMTCkKIAkJCWdvdG8gbmV4dDsKLQkJd2FpdF9vbl9idWZmZXIoYmgpOwotCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCS8qIHJlYWQgZXJyb3IsIHNraXAgYmxvY2sgJiBob3BlIGZvciB0aGUgYmVzdCAqLworCQlpZiAob2NmczJfcmVhZF9ibG9jayhkaXIsIGJsb2NrLCAmYmgpKSB7CisJCQkvKiByZWFkIGVycm9yLCBza2lwIGJsb2NrICYgaG9wZSBmb3IgdGhlIGJlc3QuCisJCQkgKiBvY2ZzMl9yZWFkX2Jsb2NrKCkgaGFzIHJlbGVhc2VkIHRoZSBiaC4gKi8KIAkJCW9jZnMyX2Vycm9yKGRpci0+aV9zYiwgInJlYWRpbmcgZGlyZWN0b3J5ICVsbHUsICIKIAkJCQkgICAgIm9mZnNldCAlbHVcbiIsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShkaXIpLT5pcF9ibGtubywKIAkJCQkgICAgYmxvY2spOwotCQkJYnJlbHNlKGJoKTsKIAkJCWdvdG8gbmV4dDsKIAkJfQogCQlpID0gb2NmczJfc2VhcmNoX2RpcmJsb2NrKGJoLCBkaXIsIG5hbWUsIG5hbWVsZW4sCkBAIC00MTcsOCArNDU4LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAlzdHJ1Y3Qgb2NmczJfaW5saW5lX2RhdGEgKmRhdGE7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGRpci0+aV9zYiksIE9DRlMyX0koZGlyKS0+aXBfYmxrbm8sCi0JCQkgICAgICAgJmRpX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGRpcik7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhkaXIsIE9DRlMyX0koZGlyKS0+aXBfYmxrbm8sICZkaV9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtNTk2LDggKzYzNiw3IEBACiAJc3RydWN0IG9jZnMyX2lubGluZV9kYXRhICpkYXRhOwogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJCSAgICAgICAmZGlfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmRpX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2coTUxfRVJST1IsICJVbmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayBmb3IgZGlyICVsbHVcbiIsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwpAQCAtNzE2LDggKzc1NSw3IEBACiAJCQlmb3IgKGkgPSByYV9zZWN0b3JzID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwogCQkJICAgICBpID4gMDsgaS0tKSB7CiAJCQkJdG1wID0gb2NmczJfYnJlYWQoaW5vZGUsICsrYmxrLCAmZXJyLCAxKTsKLQkJCQlpZiAodG1wKQotCQkJCQlicmVsc2UodG1wKTsKKwkJCQlicmVsc2UodG1wKTsKIAkJCX0KIAkJCWxhc3RfcmFfYmxrID0gYmxrOwogCQkJcmFfc2VjdG9ycyA9IDg7CkBAIC04OTksMTAgKzkzNyw4IEBACiBsZWF2ZToKIAlpZiAoc3RhdHVzIDwgMCkgewogCQkqZGlyZW50ID0gTlVMTDsKLQkJaWYgKCpkaXJlbnRfYmgpIHsKLQkJCWJyZWxzZSgqZGlyZW50X2JoKTsKLQkJCSpkaXJlbnRfYmggPSBOVUxMOwotCQl9CisJCWJyZWxzZSgqZGlyZW50X2JoKTsKKwkJKmRpcmVudF9iaCA9IE5VTEw7CiAJfQogCiAJbWxvZ19leGl0KHN0YXR1cyk7CkBAIC05NTEsOCArOTg3LDcgQEAKIAogCXJldCA9IDA7CiBiYWlsOgotCWlmIChkaXJlbnRfYmgpCi0JCWJyZWxzZShkaXJlbnRfYmgpOworCWJyZWxzZShkaXJlbnRfYmgpOwogCiAJbWxvZ19leGl0KHJldCk7CiAJcmV0dXJuIHJldDsKQEAgLTExMjcsOCArMTE2Miw3IEBACiAKIAlzdGF0dXMgPSAwOwogYmFpbDoKLQlpZiAobmV3X2JoKQotCQlicmVsc2UobmV3X2JoKTsKKwlicmVsc2UobmV3X2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xMTkyLDYgKzEyMjYsOSBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlyZGF0YV9iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CiAJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CisKKwlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGRpciwgZGlfYmgpOwogCiAJYWxsb2MgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoc2IsIGJ5dGVzKTsKIApAQCAtMTMwNSw4ICsxMzQyLDggQEAKIAkgKiBUaGlzIHNob3VsZCBuZXZlciBmYWlsIGFzIG91ciBleHRlbnQgbGlzdCBpcyBlbXB0eSBhbmQgYWxsCiAJICogcmVsYXRlZCBibG9ja3MgaGF2ZSBiZWVuIGpvdXJuYWxlZCBhbHJlYWR5LgogCSAqLwotCXJldCA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGRpciwgZGlfYmgsIDAsIGJsa25vLCBsZW4sIDAsCi0JCQkJICBOVUxMKTsKKwlyZXQgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBkaXIsICZldCwgMCwgYmxrbm8sIGxlbiwKKwkJCQkgIDAsIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC0xMzM3LDggKzEzNzQsOCBAQAogCQl9CiAJCWJsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGRpci0+aV9zYiwgYml0X29mZik7CiAKLQkJcmV0ID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgZGlyLCBkaV9iaCwgMSwgYmxrbm8sCi0JCQkJCSAgbGVuLCAwLCBOVUxMKTsKKwkJcmV0ID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgZGlyLCAmZXQsIDEsCisJCQkJCSAgYmxrbm8sIGxlbiwgMCwgTlVMTCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTEzODMsOSArMTQyMCw5IEBACiAJaWYgKGV4dGVuZCkgewogCQl1MzIgb2Zmc2V0ID0gT0NGUzJfSShkaXIpLT5pcF9jbHVzdGVyczsKIAotCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihPQ0ZTMl9TQihzYiksIGRpciwgJm9mZnNldCwKLQkJCQkJCSAgICAxLCAwLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKLQkJCQkJCSAgICBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKKwkJc3RhdHVzID0gb2NmczJfYWRkX2lub2RlX2RhdGEoT0NGUzJfU0Ioc2IpLCBkaXIsICZvZmZzZXQsCisJCQkJCSAgICAgIDEsIDAsIHBhcmVudF9mZV9iaCwgaGFuZGxlLAorCQkJCQkgICAgICBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKIAkJQlVHX09OKHN0YXR1cyA9PSAtRUFHQUlOKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTE0MzAsMTIgKzE0NjcsMTQgQEAKIAlpbnQgY3JlZGl0cywgbnVtX2ZyZWVfZXh0ZW50cywgZHJvcF9hbGxvY19zZW0gPSAwOwogCWxvZmZfdCBkaXJfaV9zaXplOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgcGFyZW50X2ZlX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZmZS0+aWQyLmlfbGlzdDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICogZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9zYi0+c2I7CisJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTE0NzksNyArMTUxOCw4IEBACiAJc3Bpbl9sb2NrKCZPQ0ZTMl9JKGRpciktPmlwX2xvY2spOwogCWlmIChkaXJfaV9zaXplID09IG9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKHNiLCBPQ0ZTMl9JKGRpciktPmlwX2NsdXN0ZXJzKSkgewogCQlzcGluX3VubG9jaygmT0NGUzJfSShkaXIpLT5pcF9sb2NrKTsKLQkJbnVtX2ZyZWVfZXh0ZW50cyA9IG9jZnMyX251bV9mcmVlX2V4dGVudHMob3NiLCBkaXIsIGZlKTsKKwkJb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoJmV0LCBkaXIsIHBhcmVudF9mZV9iaCk7CisJCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgZGlyLCAmZXQpOwogCQlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKIAkJCXN0YXR1cyA9IG51bV9mcmVlX2V4dGVudHM7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xNDg3LDcgKzE1MjcsNyBAQAogCQl9CiAKIAkJaWYgKCFudW1fZnJlZV9leHRlbnRzKSB7Ci0JCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGZlLCAmbWV0YV9hYyk7CisJCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGVsLCAmbWV0YV9hYyk7CiAJCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTUwMiw3ICsxNTQyLDcgQEAKIAkJCWdvdG8gYmFpbDsKIAkJfQogCi0JCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKHNiLCBmZSwgMSk7CisJCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKHNiLCBlbCwgMSk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2soJk9DRlMyX0koZGlyKS0+aXBfbG9jayk7CiAJCWNyZWRpdHMgPSBPQ0ZTMl9TSU1QTEVfRElSX0VYVEVORF9DUkVESVRTOwpAQCAtMTU2OCw4ICsxNjA4LDcgQEAKIAlpZiAobWV0YV9hYykKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOwogCi0JaWYgKG5ld19iaCkKLQkJYnJlbHNlKG5ld19iaCk7CisJYnJlbHNlKG5ld19iaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTY5Niw4ICsxNzM1LDcgQEAKIAogCXN0YXR1cyA9IDA7CiBiYWlsOgotCWlmIChiaCkKLQkJYnJlbHNlKGJoKTsKKwlicmVsc2UoYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE3NTYsNyArMTc5NCw2IEBACiAJKnJldF9kZV9iaCA9IGJoOwogCWJoID0gTlVMTDsKIG91dDoKLQlpZiAoYmgpCi0JCWJyZWxzZShiaCk7CisJYnJlbHNlKGJoKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IGVhZTNkNjQuLmVjNjg0NDIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTIwMjQsOCArMjAyNCw3IEBACiAJfSBlbHNlIHsKIAkJLyogQm9vLCB3ZSBoYXZlIHRvIGdvIHRvIGRpc2suICovCiAJCS8qIHJlYWQgYmgsIGNhc3QsIG9jZnMyX3JlZnJlc2hfaW5vZGUgKi8KLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIG9pLT5pcF9ibGtubywKLQkJCQkJICBiaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIG9pLT5pcF9ibGtubywgYmgpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsX3JlZnJlc2g7CkBAIC0yMDg2LDExICsyMDg1LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCi0JCQkJICBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJICByZXRfYmgsCi0JCQkJICBPQ0ZTMl9CSF9DQUNIRUQsCi0JCQkJICBpbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCByZXRfYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwppbmRleCBhZWQyNjhlLi4yYmFlZGFjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKKysrIGIvZnMvb2NmczIvZXh0ZW50X21hcC5jCkBAIC0yOTMsOCArMjkzLDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGxhc3RfZWJfYmxrLAotCQkJICAgICAgICZlYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgbGFzdF9lYl9ibGssICZlYl9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzgyLDkgKzM4MSw5IEBACiAJCWlmIChsZTY0X3RvX2NwdShlYi0+aF9uZXh0X2xlYWZfYmxrKSA9PSAwVUxMKQogCQkJZ290byBub19tb3JlX2V4dGVudHM7CiAKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsCiAJCQkJICAgICAgIGxlNjRfdG9fY3B1KGViLT5oX25leHRfbGVhZl9ibGspLAotCQkJCSAgICAgICAmbmV4dF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCQkJICAgICAgICZuZXh0X2ViX2JoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC01NTEsNiArNTUwLDY2IEBACiAJCSpudW1fY2x1c3RlcnMgPSBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycykgLSBjb2ZmOwogfQogCitpbnQgb2NmczJfeGF0dHJfZ2V0X2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiB2X2NsdXN0ZXIsCisJCQkgICAgIHUzMiAqcF9jbHVzdGVyLCB1MzIgKm51bV9jbHVzdGVycywKKwkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCXUzMiBjb2ZmOworCisJaWYgKGVsLT5sX3RyZWVfZGVwdGgpIHsKKwkJcmV0ID0gb2NmczJfZmluZF9sZWFmKGlub2RlLCBlbCwgdl9jbHVzdGVyLCAmZWJfYmgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgZWJfYmgtPmJfZGF0YTsKKwkJZWwgPSAmZWItPmhfbGlzdDsKKworCQlpZiAoZWwtPmxfdHJlZV9kZXB0aCkgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbm9kZSAlbHUgaGFzIG5vbiB6ZXJvIHRyZWUgZGVwdGggaW4gIgorCQkJCSAgICAieGF0dHIgbGVhZiBibG9jayAlbGx1XG4iLCBpbm9kZS0+aV9pbm8sCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZWJfYmgtPmJfYmxvY2tucik7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWkgPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIHZfY2x1c3Rlcik7CisJaWYgKGkgPT0gLTEpIHsKKwkJcmV0ID0gLUVST0ZTOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCQlCVUdfT04odl9jbHVzdGVyIDwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKTsKKworCQlpZiAoIXJlYy0+ZV9ibGtubykgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsICJJbm9kZSAlbHUgaGFzIGJhZCBleHRlbnQgIgorCQkJCSAgICAicmVjb3JkICgldSwgJXUsIDApIGluIHhhdHRyIiwgaW5vZGUtPmlfaW5vLAorCQkJCSAgICBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksCisJCQkJICAgIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSk7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCQljb2ZmID0gdl9jbHVzdGVyIC0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOworCQkqcF9jbHVzdGVyID0gb2NmczJfYmxvY2tzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLAorCQkJCQkJICAgIGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubykpOworCQkqcF9jbHVzdGVyID0gKnBfY2x1c3RlciArIGNvZmY7CisJCWlmIChudW1fY2x1c3RlcnMpCisJCQkqbnVtX2NsdXN0ZXJzID0gb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpIC0gY29mZjsKKwl9CitvdXQ6CisJaWYgKGViX2JoKQorCQlicmVsc2UoZWJfYmgpOworCXJldHVybiByZXQ7Cit9CisKIGludCBvY2ZzMl9nZXRfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIHZfY2x1c3RlciwKIAkJICAgICAgIHUzMiAqcF9jbHVzdGVyLCB1MzIgKm51bV9jbHVzdGVycywKIAkJICAgICAgIHVuc2lnbmVkIGludCAqZXh0ZW50X2ZsYWdzKQpAQCAtNTcxLDggKzYzMCw3IEBACiAJaWYgKHJldCA9PSAwKQogCQlnb3RvIG91dDsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkgICAgICAgJmRpX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZkaV9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXh0ZW50X21hcC5oIGIvZnMvb2NmczIvZXh0ZW50X21hcC5oCmluZGV4IDFiOTc0OTAuLjFjNGFhOGIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4dGVudF9tYXAuaAorKysgYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmgKQEAgLTUzLDQgKzUzLDggQEAKIGludCBvY2ZzMl9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKIAkJIHU2NCBtYXBfc3RhcnQsIHU2NCBtYXBfbGVuKTsKIAoraW50IG9jZnMyX3hhdHRyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAorCQkJICAgICB1MzIgKnBfY2x1c3RlciwgdTMyICpudW1fY2x1c3RlcnMsCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpOworCiAjZW5kaWYgIC8qIF9FWFRFTlRfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCBlZDM4Nzk2Li44ZDMyMjVhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSAibW1hcC5oIgogI2luY2x1ZGUgInN1YmFsbG9jLmgiCiAjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgogCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIApAQCAtMTg0LDcgKzE4NSw3IEBACiAJCWdvdG8gYmFpbDsKIAogCWpvdXJuYWwgPSBvc2ItPmpvdXJuYWwtPmpfam91cm5hbDsKLQllcnIgPSBqb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwllcnIgPSBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWwpOwogCiBiYWlsOgogCW1sb2dfZXhpdChlcnIpOwpAQCAtNDg4LDcgKzQ4OSw3IEBACiB9CiAKIC8qCi0gKiBleHRlbmQgYWxsb2NhdGlvbiBvbmx5IGhlcmUuCisgKiBleHRlbmQgZmlsZSBhbGxvY2F0aW9uIG9ubHkgaGVyZS4KICAqIHdlJ2xsIHVwZGF0ZSBhbGwgdGhlIGRpc2sgc3R1ZmYsIGFuZCBvaXAtPmFsbG9jX3NpemUKICAqCiAgKiBleHBlY3Qgc3R1ZmYgdG8gYmUgbG9ja2VkLCBhIHRyYW5zYWN0aW9uIHN0YXJ0ZWQgYW5kIGVub3VnaCBkYXRhIC8KQEAgLTQ5NywxODkgKzQ5OCwyNSBAQAogICogV2lsbCByZXR1cm4gLUVBR0FJTiwgYW5kIGEgcmVhc29uIGlmIGEgcmVzdGFydCBpcyBuZWVkZWQuCiAgKiBJZiBwYXNzZWQgaW4sICpyZWFzb24gd2lsbCBhbHdheXMgYmUgc2V0LCBldmVuIGluIGVycm9yLgogICovCi1pbnQgb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICB1MzIgKmxvZ2ljYWxfb2Zmc2V0LAotCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCi0JCQkgICAgICAgaW50IG1hcmtfdW53cml0dGVuLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCi0JCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKLQkJCSAgICAgICBlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uX3JldCkKK2ludCBvY2ZzMl9hZGRfaW5vZGVfZGF0YShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHUzMiAqbG9naWNhbF9vZmZzZXQsCisJCQkgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSBpbnQgbWFya191bndyaXR0ZW4sCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKKwkJCSBoYW5kbGVfdCAqaGFuZGxlLAorCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KQogewotCWludCBzdGF0dXMgPSAwOwotCWludCBmcmVlX2V4dGVudHM7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBmZV9iaC0+Yl9kYXRhOwotCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHJlYXNvbiA9IFJFU1RBUlRfTk9ORTsKLQl1MzIgYml0X29mZiwgbnVtX2JpdHM7Ci0JdTY0IGJsb2NrOwotCXU4IGZsYWdzID0gMDsKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKIAotCUJVR19PTighY2x1c3RlcnNfdG9fYWRkKTsKLQotCWlmIChtYXJrX3Vud3JpdHRlbikKLQkJZmxhZ3MgPSBPQ0ZTMl9FWFRfVU5XUklUVEVOOwotCi0JZnJlZV9leHRlbnRzID0gb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhvc2IsIGlub2RlLCBmZSk7Ci0JaWYgKGZyZWVfZXh0ZW50cyA8IDApIHsKLQkJc3RhdHVzID0gZnJlZV9leHRlbnRzOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0JLyogdGhlcmUgYXJlIHR3byBjYXNlcyB3aGljaCBjb3VsZCBjYXVzZSB1cyB0byBFQUdBSU4gaW4gdGhlCi0JICogd2UtbmVlZC1tb3JlLW1ldGFkYXRhIGNhc2U6Ci0JICogMSkgd2UgaGF2ZW4ndCByZXNlcnZlZCAqYW55KgotCSAqIDIpIHdlIGFyZSBzbyBmcmFnbWVudGVkLCB3ZSd2ZSBuZWVkZWQgdG8gYWRkIG1ldGFkYXRhIHRvbwotCSAqICAgIG1hbnkgdGltZXMuICovCi0JaWYgKCFmcmVlX2V4dGVudHMgJiYgIW1ldGFfYWMpIHsKLQkJbWxvZygwLCAid2UgaGF2ZW4ndCByZXNlcnZlZCBhbnkgbWV0YWRhdGEhXG4iKTsKLQkJc3RhdHVzID0gLUVBR0FJTjsKLQkJcmVhc29uID0gUkVTVEFSVF9NRVRBOwotCQlnb3RvIGxlYXZlOwotCX0gZWxzZSBpZiAoKCFmcmVlX2V4dGVudHMpCi0JCSAgICYmIChvY2ZzMl9hbGxvY19jb250ZXh0X2JpdHNfbGVmdChtZXRhX2FjKQotCQkgICAgICAgPCBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZmUpKSkgewotCQltbG9nKDAsICJmaWxlc3lzdGVtIGlzIHJlYWxseSBmcmFnbWVudGVkLi4uXG4iKTsKLQkJc3RhdHVzID0gLUVBR0FJTjsKLQkJcmVhc29uID0gUkVTVEFSVF9NRVRBOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCXN0YXR1cyA9IF9fb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsCi0JCQkJCWNsdXN0ZXJzX3RvX2FkZCwgJmJpdF9vZmYsICZudW1fYml0cyk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCUJVR19PTihudW1fYml0cyA+IGNsdXN0ZXJzX3RvX2FkZCk7Ci0KLQkvKiByZXNlcnZlIG91ciB3cml0ZSBlYXJseSAtLSBpbnNlcnRfZXh0ZW50IG1heSB1cGRhdGUgdGhlIGlub2RlICovCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQlibG9jayA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKTsKLQltbG9nKDAsICJBbGxvY2F0aW5nICV1IGNsdXN0ZXJzIGF0IGJsb2NrICV1IGZvciBpbm9kZSAlbGx1XG4iLAotCSAgICAgbnVtX2JpdHMsIGJpdF9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQlzdGF0dXMgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBpbm9kZSwgZmVfYmgsCi0JCQkJICAgICAqbG9naWNhbF9vZmZzZXQsIGJsb2NrLCBudW1fYml0cywKLQkJCQkgICAgIGZsYWdzLCBtZXRhX2FjKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZlX2JoKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0JY2x1c3RlcnNfdG9fYWRkIC09IG51bV9iaXRzOwotCSpsb2dpY2FsX29mZnNldCArPSBudW1fYml0czsKLQotCWlmIChjbHVzdGVyc190b19hZGQpIHsKLQkJbWxvZygwLCAibmVlZCB0byBhbGxvYyBvbmNlIG1vcmUsIGNsdXN0ZXJzID0gJXUsIHdhbnRlZCA9ICIKLQkJICAgICAiJXVcbiIsIGZlLT5pX2NsdXN0ZXJzLCBjbHVzdGVyc190b19hZGQpOwotCQlzdGF0dXMgPSAtRUFHQUlOOwotCQlyZWFzb24gPSBSRVNUQVJUX1RSQU5TOwotCX0KLQotbGVhdmU6Ci0JbWxvZ19leGl0KHN0YXR1cyk7Ci0JaWYgKHJlYXNvbl9yZXQpCi0JCSpyZWFzb25fcmV0ID0gcmVhc29uOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBGb3IgYSBnaXZlbiBhbGxvY2F0aW9uLCBkZXRlcm1pbmUgd2hpY2ggYWxsb2NhdG9ycyB3aWxsIG5lZWQgdG8gYmUKLSAqIGFjY2Vzc2VkLCBhbmQgbG9jayB0aGVtLCByZXNlcnZpbmcgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBiaXRzLgotICoKLSAqIFNwYXJzZSBmaWxlIHN5c3RlbXMgY2FsbCB0aGlzIGZyb20gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKCkKLSAqIGFuZCBvY2ZzMl9hbGxvY2F0ZV91bndyaXR0ZW5fZXh0ZW50cygpLgotICoKLSAqIEZpbGUgc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IGhvbGVzIGNhbGwgdGhpcyBmcm9tCi0gKiBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbigpLgotICovCi1pbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLCB1MzIgZXh0ZW50c190b19zcGxpdCwKLQkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLAotCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKm1ldGFfYWMpCi17Ci0JaW50IHJldCA9IDAsIG51bV9mcmVlX2V4dGVudHM7Ci0JdW5zaWduZWQgaW50IG1heF9yZWNzX25lZWRlZCA9IGNsdXN0ZXJzX3RvX2FkZCArIDIgKiBleHRlbnRzX3RvX3NwbGl0OwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCi0JKm1ldGFfYWMgPSBOVUxMOwotCWlmIChkYXRhX2FjKQotCQkqZGF0YV9hYyA9IE5VTEw7Ci0KLQlCVUdfT04oY2x1c3RlcnNfdG9fYWRkICE9IDAgJiYgZGF0YV9hYyA9PSBOVUxMKTsKLQotCW1sb2coMCwgImV4dGVuZCBpbm9kZSAlbGx1LCBpX3NpemUgPSAlbGxkLCBkaS0+aV9jbHVzdGVycyA9ICV1LCAiCi0JICAgICAiY2x1c3RlcnNfdG9fYWRkID0gJXUsIGV4dGVudHNfdG9fc3BsaXQgPSAldVxuIiwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAobG9uZyBsb25nKWlfc2l6ZV9yZWFkKGlub2RlKSwKLQkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkLCBleHRlbnRzX3RvX3NwbGl0KTsKLQotCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGRpKTsKLQlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKLQkJcmV0ID0gbnVtX2ZyZWVfZXh0ZW50czsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIFNwYXJzZSBhbGxvY2F0aW9uIGZpbGUgc3lzdGVtcyBuZWVkIHRvIGJlIG1vcmUgY29uc2VydmF0aXZlCi0JICogd2l0aCByZXNlcnZpbmcgcm9vbSBmb3IgZXhwYW5zaW9uIC0gdGhlIGFjdHVhbCBhbGxvY2F0aW9uCi0JICogaGFwcGVucyB3aGlsZSB3ZSd2ZSBnb3QgYSBqb3VybmFsIGhhbmRsZSBvcGVuIHNvIHJlLXRha2luZwotCSAqIGEgY2x1c3RlciBsb2NrIChiZWNhdXNlIHdlIHJhbiBvdXQgb2Ygcm9vbSBmb3IgYW5vdGhlcgotCSAqIGV4dGVudCkgd2lsbCB2aW9sYXRlIG9yZGVyaW5nIHJ1bGVzLgotCSAqCi0JICogTW9zdCBvZiB0aGUgdGltZSB3ZSdsbCBvbmx5IGJlIHNlZWluZyB0aGlzIDEgY2x1c3RlciBhdCBhIHRpbWUKLQkgKiBhbnl3YXkuCi0JICoKLQkgKiBBbHdheXMgbG9jayBmb3IgYW55IHVud3JpdHRlbiBleHRlbnRzIC0gd2UgbWlnaHQgd2FudCB0bwotCSAqIGFkZCBibG9ja3MgZHVyaW5nIGEgc3BsaXQuCi0JICovCi0JaWYgKCFudW1fZnJlZV9leHRlbnRzIHx8Ci0JICAgIChvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSAmJiBudW1fZnJlZV9leHRlbnRzIDwgbWF4X3JlY3NfbmVlZGVkKSkgewotCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGRpLCBtZXRhX2FjKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWlmIChyZXQgIT0gLUVOT1NQQykKLQkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCWlmIChjbHVzdGVyc190b19hZGQgPT0gMCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgY2x1c3RlcnNfdG9fYWRkLCBkYXRhX2FjKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ICE9IC1FTk9TUEMpCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotb3V0OgotCWlmIChyZXQpIHsKLQkJaWYgKCptZXRhX2FjKSB7Ci0JCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoKm1ldGFfYWMpOwotCQkJKm1ldGFfYWMgPSBOVUxMOwotCQl9Ci0KLQkJLyoKLQkJICogV2UgY2Fubm90IGhhdmUgYW4gZXJyb3IgYW5kIGEgbm9uIG51bGwgKmRhdGFfYWMuCi0JCSAqLwotCX0KKwlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCBmZV9iaCk7CisJcmV0ID0gb2NmczJfYWRkX2NsdXN0ZXJzX2luX2J0cmVlKG9zYiwgaW5vZGUsIGxvZ2ljYWxfb2Zmc2V0LAorCQkJCQkgICBjbHVzdGVyc190b19hZGQsIG1hcmtfdW53cml0dGVuLAorCQkJCQkgICAmZXQsIGhhbmRsZSwKKwkJCQkJICAgZGF0YV9hYywgbWV0YV9hYywgcmVhc29uX3JldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjk4LDYgKzUzNSw3IEBACiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHdoeTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKIAltbG9nX2VudHJ5KCIoY2x1c3RlcnNfdG9fYWRkID0gJXUpXG4iLCBjbHVzdGVyc190b19hZGQpOwogCkBAIC03MDcsOCArNTQ1LDcgQEAKIAkgKi8KIAlCVUdfT04obWFya191bndyaXR0ZW4gJiYgIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCwKLQkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC03MjQsMTQgKzU2MSwyMSBAQAogcmVzdGFydF9hbGw6CiAJQlVHX09OKGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSAhPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOwogCi0Jc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBmZSwgY2x1c3RlcnNfdG9fYWRkLCAwLCAmZGF0YV9hYywKLQkJCQkgICAgICAgJm1ldGFfYWMpOworCW1sb2coMCwgImV4dGVuZCBpbm9kZSAlbGx1LCBpX3NpemUgPSAlbGxkLCBkaS0+aV9jbHVzdGVycyA9ICV1LCAiCisJICAgICAiY2x1c3RlcnNfdG9fYWRkID0gJXVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkgICAgIChsb25nIGxvbmcpaV9zaXplX3JlYWQoaW5vZGUpLCBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycyksCisJICAgICBjbHVzdGVyc190b19hZGQpOworCW9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIGJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwgY2x1c3RlcnNfdG9fYWRkLCAwLAorCQkJCSAgICAgICAmZGF0YV9hYywgJm1ldGFfYWMpOwogCWlmIChzdGF0dXMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwogCX0KIAotCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKG9zYi0+c2IsIGZlLCBjbHVzdGVyc190b19hZGQpOworCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKG9zYi0+c2IsICZmZS0+aWQyLmlfbGlzdCwKKwkJCQkJICAgIGNsdXN0ZXJzX3RvX2FkZCk7CiAJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwpAQCAtNzUzLDE2ICs1OTcsMTYgQEAKIAogCXByZXZfY2x1c3RlcnMgPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnM7CiAKLQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihvc2IsCi0JCQkJCSAgICBpbm9kZSwKLQkJCQkJICAgICZsb2dpY2FsX3N0YXJ0LAotCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkLAotCQkJCQkgICAgbWFya191bndyaXR0ZW4sCi0JCQkJCSAgICBiaCwKLQkJCQkJICAgIGhhbmRsZSwKLQkJCQkJICAgIGRhdGFfYWMsCi0JCQkJCSAgICBtZXRhX2FjLAotCQkJCQkgICAgJndoeSk7CisJc3RhdHVzID0gb2NmczJfYWRkX2lub2RlX2RhdGEob3NiLAorCQkJCSAgICAgIGlub2RlLAorCQkJCSAgICAgICZsb2dpY2FsX3N0YXJ0LAorCQkJCSAgICAgIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQkgICAgICBtYXJrX3Vud3JpdHRlbiwKKwkJCQkgICAgICBiaCwKKwkJCQkgICAgICBoYW5kbGUsCisJCQkJICAgICAgZGF0YV9hYywKKwkJCQkgICAgICBtZXRhX2FjLAorCQkJCSAgICAgICZ3aHkpOwogCWlmICgoc3RhdHVzIDwgMCkgJiYgKHN0YXR1cyAhPSAtRUFHQUlOKSkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC03ODksNyArNjMzLDcgQEAKIAkJCW1sb2coMCwgInJlc3RhcnRpbmcgdHJhbnNhY3Rpb24uXG4iKTsKIAkJCS8qIFRPRE86IFRoaXMgY2FuIGJlIG1vcmUgaW50ZWxsaWdlbnQuICovCiAJCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLAotCQkJCQkJCSAgICBmZSwKKwkJCQkJCQkgICAgJmZlLT5pZDIuaV9saXN0LAogCQkJCQkJCSAgICBjbHVzdGVyc190b19hZGQpOwogCQkJc3RhdHVzID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CiAJCQlpZiAoc3RhdHVzIDwgMCkgewpAQCAtODI2LDEwICs2NzAsOCBAQAogCQlyZXN0YXJ0X2Z1bmMgPSAwOwogCQlnb3RvIHJlc3RhcnRfYWxsOwogCX0KLQlpZiAoYmgpIHsKLQkJYnJlbHNlKGJoKTsKLQkJYmggPSBOVUxMOwotCX0KKwlicmVsc2UoYmgpOworCWJoID0gTlVMTDsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xMDk2LDkgKzkzOCwxNSBAQAogCQkJZ290byBiYWlsX3VubG9jazsKIAkJfQogCi0JCWlmIChpX3NpemVfcmVhZChpbm9kZSkgPiBhdHRyLT5pYV9zaXplKQorCQlpZiAoaV9zaXplX3JlYWQoaW5vZGUpID4gYXR0ci0+aWFfc2l6ZSkgeworCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQkJCXN0YXR1cyA9IG9jZnMyX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoaW5vZGUsCisJCQkJCQkJCSAgICAgIGF0dHItPmlhX3NpemUpOworCQkJCWlmIChzdGF0dXMpCisJCQkJCWdvdG8gYmFpbF91bmxvY2s7CisJCQl9CiAJCQlzdGF0dXMgPSBvY2ZzMl90cnVuY2F0ZV9maWxlKGlub2RlLCBiaCwgYXR0ci0+aWFfc2l6ZSk7Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlzdGF0dXMgPSBvY2ZzMl9leHRlbmRfZmlsZShpbm9kZSwgYmgsIGF0dHItPmlhX3NpemUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQpAQCAtMTE0MCw4ICs5ODgsNyBAQAogCWlmIChzaXplX2NoYW5nZSkKIAkJb2NmczJfcndfdW5sb2NrKGlub2RlLCAxKTsKIGJhaWw6Ci0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTI4NCw4ICsxMTMxLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJICAgICAgIG9pLT5pcF9ibGtubywgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBvaS0+aXBfYmxrbm8sICZiaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTEzMTEsOSArMTE1Nyw4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CiAKIAlpZiAoT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKSB7Ci0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCSAgICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZkaV9iaCwKLQkJCQkgICAgICAgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCQkgICAgICAgJmRpX2JoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0xMzk0LDggKzEyMzksMTEgQEAKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKLQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGRpLCAwLCAxLCBOVUxMLCAmbWV0YV9hYyk7CisJb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgZGlfYmgpOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIDAsIDEsIE5VTEwsICZtZXRhX2FjKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTE0MjUsNyArMTI3Myw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX3JlbW92ZV9leHRlbnQoaW5vZGUsIGRpX2JoLCBjcG9zLCBsZW4sIGhhbmRsZSwgbWV0YV9hYywKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCAmZXQsIGNwb3MsIGxlbiwgaGFuZGxlLCBtZXRhX2FjLAogCQkJCSAgZGVhbGxvYyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yMDQwLDcgKzE4ODgsNyBAQAogCQkgKi8KIAkJaWYgKG9sZF9zaXplICE9IGlfc2l6ZV9yZWFkKGlub2RlKSB8fAogCQkgICAgb2xkX2NsdXN0ZXJzICE9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycykgewotCQkJcmV0ID0gam91cm5hbF9mb3JjZV9jb21taXQob3NiLT5qb3VybmFsLT5qX2pvdXJuYWwpOworCQkJcmV0ID0gamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdChvc2ItPmpvdXJuYWwtPmpfam91cm5hbCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQl3cml0dGVuID0gcmV0OwogCQl9CkBAIC0yMjI3LDYgKzIwNzUsMTAgQEAKIAkuc2V0YXR0cgk9IG9jZnMyX3NldGF0dHIsCiAJLmdldGF0dHIJPSBvY2ZzMl9nZXRhdHRyLAogCS5wZXJtaXNzaW9uCT0gb2NmczJfcGVybWlzc2lvbiwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IG9jZnMyX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5mYWxsb2NhdGUJPSBvY2ZzMl9mYWxsb2NhdGUsCiAJLmZpZW1hcAkJPSBvY2ZzMl9maWVtYXAsCiB9OwpAQCAtMjIzNyw2ICsyMDg5LDEwIEBACiAJLnBlcm1pc3Npb24JPSBvY2ZzMl9wZXJtaXNzaW9uLAogfTsKIAorLyoKKyAqIE90aGVyIHRoYW4gLT5sb2NrLCBrZWVwIG9jZnMyX2ZvcHMgYW5kIG9jZnMyX2RvcHMgaW4gc3luYyB3aXRoCisgKiBvY2ZzMl9mb3BzX25vX3Bsb2NrcyBhbmQgb2NmczJfZG9wc19ub19wbG9ja3MhCisgKi8KIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZm9wcyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLnJlYWQJCT0gZG9fc3luY19yZWFkLApAQCAtMjI1MSwxMiArMjEwNyw1OSBAQAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsICAgPSBvY2ZzMl9jb21wYXRfaW9jdGwsCiAjZW5kaWYKKwkubG9jawkJPSBvY2ZzMl9sb2NrLAorCS5mbG9jawkJPSBvY2ZzMl9mbG9jaywKKwkuc3BsaWNlX3JlYWQJPSBvY2ZzMl9maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2Vfd3JpdGUJPSBvY2ZzMl9maWxlX3NwbGljZV93cml0ZSwKK307CisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZG9wcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IG9jZnMyX3JlYWRkaXIsCisJLmZzeW5jCQk9IG9jZnMyX3N5bmNfZmlsZSwKKwkucmVsZWFzZQk9IG9jZnMyX2Rpcl9yZWxlYXNlLAorCS5vcGVuCQk9IG9jZnMyX2Rpcl9vcGVuLAorCS51bmxvY2tlZF9pb2N0bAk9IG9jZnMyX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsICAgPSBvY2ZzMl9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkubG9jawkJPSBvY2ZzMl9sb2NrLAorCS5mbG9jawkJPSBvY2ZzMl9mbG9jaywKK307CisKKy8qCisgKiBQT1NJWC1sb2NrbGVzcyB2YXJpYW50cyBvZiBvdXIgZmlsZV9vcGVyYXRpb25zLgorICoKKyAqIFRoZXNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgdW5kZXJseWluZyBjbHVzdGVyIHN0YWNrIGRvZXMgbm90IHN1cHBvcnQKKyAqIHBvc2l4IGZpbGUgbG9ja2luZywgaWYgdGhlIHVzZXIgcGFzc2VzIHRoZSAibG9jYWxmbG9ja3MiIG1vdW50CisgKiBvcHRpb24sIG9yIGlmIHdlIGhhdmUgYSBsb2NhbC1vbmx5IGZzLgorICoKKyAqIG9jZnMyX2Zsb2NrIGlzIGluIGhlcmUgYmVjYXVzZSBhbGwgc3RhY2tzIGhhbmRsZSBVTklYIGZpbGUgbG9ja3MsCisgKiBzbyB3ZSBzdGlsbCB3YW50IGl0IGluIHRoZSBjYXNlIG9mIG5vIHN0YWNrIHN1cHBvcnQgZm9yCisgKiBwbG9ja3MuIEludGVybmFsbHksIGl0IHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gYXNrZWQgdG8gaWdub3JlCisgKiB0aGUgY2x1c3Rlci4KKyAqLworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9mb3BzX25vX3Bsb2NrcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZG9fc3luY19yZWFkLAorCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAorCS5tbWFwCQk9IG9jZnMyX21tYXAsCisJLmZzeW5jCQk9IG9jZnMyX3N5bmNfZmlsZSwKKwkucmVsZWFzZQk9IG9jZnMyX2ZpbGVfcmVsZWFzZSwKKwkub3BlbgkJPSBvY2ZzMl9maWxlX29wZW4sCisJLmFpb19yZWFkCT0gb2NmczJfZmlsZV9haW9fcmVhZCwKKwkuYWlvX3dyaXRlCT0gb2NmczJfZmlsZV9haW9fd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gb2NmczJfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgICA9IG9jZnMyX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCS5mbG9jawkJPSBvY2ZzMl9mbG9jaywKIAkuc3BsaWNlX3JlYWQJPSBvY2ZzMl9maWxlX3NwbGljZV9yZWFkLAogCS5zcGxpY2Vfd3JpdGUJPSBvY2ZzMl9maWxlX3NwbGljZV93cml0ZSwKIH07CiAKLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZG9wcyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZG9wc19ub19wbG9ja3MgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCiAJLnJlYWRkaXIJPSBvY2ZzMl9yZWFkZGlyLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5oIGIvZnMvb2NmczIvZmlsZS5oCmluZGV4IDFlMjdiNGQuLmU5MjM4MmMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuaAorKysgYi9mcy9vY2ZzMi9maWxlLmgKQEAgLTI4LDkgKzI4LDEyIEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9jZnMyX2ZvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9kb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZm9wc19ub19wbG9ja3M7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9kb3BzX25vX3Bsb2NrczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBvY2ZzMl9maWxlX2lvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb2NmczJfc3BlY2lhbF9maWxlX2lvcHM7CiBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dDsKK2VudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkOwogCiBzdHJ1Y3Qgb2NmczJfZmlsZV9wcml2YXRlIHsKIAlzdHJ1Y3QgZmlsZQkJKmZwX2ZpbGU7CkBAIC0zOCwyNyArNDEsMTggQEAKIAlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMJZnBfZmxvY2s7CiB9OwogCi1lbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCB7Ci0JUkVTVEFSVF9OT05FID0gMCwKLQlSRVNUQVJUX1RSQU5TLAotCVJFU1RBUlRfTUVUQQotfTsKLWludCBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIHUzMiAqbG9naWNhbF9vZmZzZXQsCi0JCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKLQkJCSAgICAgICBpbnQgbWFya191bndyaXR0ZW4sCi0JCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAotCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KTsKK2ludCBvY2ZzMl9hZGRfaW5vZGVfZGF0YShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHUzMiAqbG9naWNhbF9vZmZzZXQsCisJCQkgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSBpbnQgbWFya191bndyaXR0ZW4sCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKKwkJCSBoYW5kbGVfdCAqaGFuZGxlLAorCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KTsKIGludCBvY2ZzMl9leHRlbmRfbm9faG9sZXMoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IG5ld19pX3NpemUsCiAJCQkgIHU2NCB6ZXJvX3RvKTsKLWludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAotCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCi0JCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYyk7CiBpbnQgb2NmczJfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBpbnQgb2NmczJfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgIHN0cnVjdCBrc3RhdCAqc3RhdCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pbm9kZS5jIGIvZnMvb2NmczIvaW5vZGUuYwppbmRleCA3ZTllNGM3Li40OTAzNjg4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pbm9kZS5jCisrKyBiL2ZzL29jZnMyL2lub2RlLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlICJzeW1saW5rLmgiCiAjaW5jbHVkZSAic3lzZmlsZS5oIgogI2luY2x1ZGUgInVwdG9kYXRlLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKQEAgLTIxOSw2ICsyMjAsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2I7CiAJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisJaW50IHVzZV9wbG9ja3MgPSAxOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsIHNpemU6JWxsdSlcbiIsIGlub2RlLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX3NpemUpKTsKQEAgLTIyNiw2ICsyMjgsMTAgQEAKIAlzYiA9IGlub2RlLT5pX3NiOwogCW9zYiA9IE9DRlMyX1NCKHNiKTsKIAorCWlmICgob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX0xPQ0FMRkxPQ0tTKSB8fAorCSAgICBvY2ZzMl9tb3VudF9sb2NhbChvc2IpIHx8ICFvY2ZzMl9zdGFja19zdXBwb3J0c19wbG9ja3MoKSkKKwkJdXNlX3Bsb2NrcyA9IDA7CisKIAkvKiB0aGlzIG1lYW5zIHRoYXQgcmVhZF9pbm9kZSBjYW5ub3QgY3JlYXRlIGEgc3VwZXJibG9jayBpbm9kZQogCSAqIHRvZGF5LiAgY2hhbmdlIGlmIG5lZWRlZC4gKi8KIAlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkgfHwKQEAgLTI5NSwxMyArMzAxLDE5IEBACiAKIAlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKIAkgICAgY2FzZSBTX0lGUkVHOgotCQkgICAgaW5vZGUtPmlfZm9wID0gJm9jZnMyX2ZvcHM7CisJCSAgICBpZiAodXNlX3Bsb2NrcykKKwkJCSAgICBpbm9kZS0+aV9mb3AgPSAmb2NmczJfZm9wczsKKwkJICAgIGVsc2UKKwkJCSAgICBpbm9kZS0+aV9mb3AgPSAmb2NmczJfZm9wc19ub19wbG9ja3M7CiAJCSAgICBpbm9kZS0+aV9vcCA9ICZvY2ZzMl9maWxlX2lvcHM7CiAJCSAgICBpX3NpemVfd3JpdGUoaW5vZGUsIGxlNjRfdG9fY3B1KGZlLT5pX3NpemUpKTsKIAkJICAgIGJyZWFrOwogCSAgICBjYXNlIFNfSUZESVI6CiAJCSAgICBpbm9kZS0+aV9vcCA9ICZvY2ZzMl9kaXJfaW9wczsKLQkJICAgIGlub2RlLT5pX2ZvcCA9ICZvY2ZzMl9kb3BzOworCQkgICAgaWYgKHVzZV9wbG9ja3MpCisJCQkgICAgaW5vZGUtPmlfZm9wID0gJm9jZnMyX2RvcHM7CisJCSAgICBlbHNlCisJCQkgICAgaW5vZGUtPmlfZm9wID0gJm9jZnMyX2RvcHNfbm9fcGxvY2tzOwogCQkgICAgaV9zaXplX3dyaXRlKGlub2RlLCBsZTY0X3RvX2NwdShmZS0+aV9zaXplKSk7CiAJCSAgICBicmVhazsKIAkgICAgY2FzZSBTX0lGTE5LOgpAQCAtNDQ4LDggKzQ2MCwxMSBAQAogCQl9CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGFyZ3MtPmZpX2Jsa25vLCAmYmgsIDAsCi0JCQkJICBjYW5fbG9jayA/IGlub2RlIDogTlVMTCk7CisJaWYgKGNhbl9sb2NrKQorCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgYXJncy0+ZmlfYmxrbm8sIDEsICZiaCwKKwkJCQkJICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKKwllbHNlCisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzX3N5bmMob3NiLCBhcmdzLT5maV9ibGtubywgMSwgJmJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTUyMiw2ICs1MzcsOSBAQAogCSAqIGRhdGEgYW5kIGZhc3Qgc3ltbGlua3MuCiAJICovCiAJaWYgKGZlLT5pX2NsdXN0ZXJzKSB7CisJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCisJCQlvY2ZzMl9iZWdpbl9vcmRlcmVkX3RydW5jYXRlKGlub2RlLCAwKTsKKwogCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKIAkJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CkBAIC03MzAsNiArNzQ4LDEzIEBACiAJCWdvdG8gYmFpbF91bmxvY2tfZGlyOwogCX0KIAorCS8qRnJlZSBleHRlbmRlZCBhdHRyaWJ1dGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlub2RlLiovCisJc3RhdHVzID0gb2NmczJfeGF0dHJfcmVtb3ZlKGlub2RlLCBkaV9iaCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGJhaWxfdW5sb2NrX2RpcjsKKwl9CisKIAlzdGF0dXMgPSBvY2ZzMl9yZW1vdmVfaW5vZGUoaW5vZGUsIGRpX2JoLCBvcnBoYW5fZGlyX2lub2RlLAogCQkJCSAgICBvcnBoYW5fZGlyX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkKQEAgLTEwODEsNiArMTEwNiw4IEBACiAJb2ktPmlwX2xhc3RfdHJhbnMgPSAwOwogCW9pLT5pcF9kaXJfc3RhcnRfbG9va3VwID0gMDsKIAlvaS0+aXBfYmxrbm8gPSAwVUxMOworCWpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZShPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPmpvdXJuYWwtPmpfam91cm5hbCwKKwkJCQkgICAgICAgJm9pLT5pcF9qaW5vZGUpOwogCiBiYWlsOgogCW1sb2dfZXhpdF92b2lkKCk7CkBAIC0xMTA3LDU4ICsxMTM0LDYgQEAKIH0KIAogLyoKLSAqIFRPRE86IHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIG1lcmdlZCBpbnRvIG9jZnMyX2dldF9ibG9jawotICoKLSAqIEhvd2V2ZXIsIHlvdSBub3cgbmVlZCB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZSBjb250X3ByZXBhcmVfd3JpdGUoKQotICogc3R1ZmYgaW4gb2NmczJfZ2V0X2Jsb2NrICh0aGF0IGlzLCBvY2ZzMl9nZXRfYmxvY2sgcHJldHR5IG11Y2gKLSAqIGV4cGVjdHMgbmV2ZXIgdG8gZXh0ZW5kKS4KLSAqLwotc3RydWN0IGJ1ZmZlcl9oZWFkICpvY2ZzMl9icmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWludCBibG9jaywgaW50ICplcnIsIGludCByZWFkYSkKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlpbnQgdG1wZXJyOwotCXU2NCBwX2Jsa25vOwotCWludCByZWFkZmxhZ3MgPSBPQ0ZTMl9CSF9DQUNIRUQ7Ci0KLQlpZiAocmVhZGEpCi0JCXJlYWRmbGFncyB8PSBPQ0ZTMl9CSF9SRUFEQUhFQUQ7Ci0KLQlpZiAoKCh1NjQpYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpID49Ci0JICAgIGlfc2l6ZV9yZWFkKGlub2RlKSkgewotCQlCVUdfT04oIXJlYWRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZG93bl9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKLQl0bXBlcnIgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrLCAmcF9ibGtubywgTlVMTCwKLQkJCQkJICAgICBOVUxMKTsKLQl1cF9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKLQlpZiAodG1wZXJyIDwgMCkgewotCQltbG9nX2Vycm5vKHRtcGVycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQl0bXBlcnIgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgcF9ibGtubywgJmJoLAotCQkJCSAgcmVhZGZsYWdzLCBpbm9kZSk7Ci0JaWYgKHRtcGVyciA8IDApCi0JCWdvdG8gZmFpbDsKLQotCXRtcGVyciA9IDA7Ci0KLQkqZXJyID0gMDsKLQlyZXR1cm4gYmg7Ci0KLWZhaWw6Ci0JaWYgKGJoKSB7Ci0JCWJyZWxzZShiaCk7Ci0JCWJoID0gTlVMTDsKLQl9Ci0JKmVyciA9IC1FSU87Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCiAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIG91ciBnZXRhdHRyLgogICovCiBpbnQgb2NmczJfaW5vZGVfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pbm9kZS5oIGIvZnMvb2NmczIvaW5vZGUuaAppbmRleCAzOTBhODU1Li4yZjM3YWY5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pbm9kZS5oCisrKyBiL2ZzL29jZnMyL2lub2RlLmgKQEAgLTQwLDYgKzQwLDkgQEAKIAkvKiBwcm90ZWN0cyBhbGxvY2F0aW9uIGNoYW5nZXMgb24gdGhpcyBpbm9kZS4gKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCQlpcF9hbGxvY19zZW07CiAKKwkvKiBwcm90ZWN0cyBleHRlbmRlZCBhdHRyaWJ1dGUgY2hhbmdlcyBvbiB0aGlzIGlub2RlICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZQkJaXBfeGF0dHJfc2VtOworCiAJLyogVGhlc2UgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgaXBfbG9jayAqLwogCXNwaW5sb2NrX3QJCQlpcF9sb2NrOwogCXUzMgkJCQlpcF9vcGVuX2NvdW50OwpAQCAtNjgsNiArNzEsNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwCQlpcF9leHRlbnRfbWFwOwogCiAJc3RydWN0IGlub2RlCQkJdmZzX2lub2RlOworCXN0cnVjdCBqYmQyX2lub2RlCQlpcF9qaW5vZGU7CiB9OwogCiAvKgpAQCAtMTEzLDggKzExNyw2IEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG9jZnMyX2FvcHM7CiAKLXN0cnVjdCBidWZmZXJfaGVhZCAqb2NmczJfYnJlYWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJsb2NrLAotCQkJCWludCAqZXJyLCBpbnQgcmVhZGEpOwogdm9pZCBvY2ZzMl9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHZvaWQgb2NmczJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBvY2ZzMl9kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW9jdGwuYyBiL2ZzL29jZnMyL2lvY3RsLmMKaW5kZXggN2IxNDJmMC4uOWZjZDM2ZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW9jdGwuYworKysgYi9mcy9vY2ZzMi9pb2N0bC5jCkBAIC0xMDIsOCArMTAyLDcgQEAKIGJhaWw6CiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKLQlpZiAoYmgpCi0JCWJyZWxzZShiaCk7CisJYnJlbHNlKGJoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmMgYi9mcy9vY2ZzMi9qb3VybmFsLmMKaW5kZXggYzQ3YmMyYS4uODFlNDA2NyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5jCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuYwpAQCAtMjE1LDkgKzIxNSw5IEBACiAJCWdvdG8gZmluYWxseTsKIAl9CiAKLQlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOwotCXN0YXR1cyA9IGpvdXJuYWxfZmx1c2goam91cm5hbC0+al9qb3VybmFsKTsKLQlqb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwtPmpfam91cm5hbCk7CisJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOworCXN0YXR1cyA9IGpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsLT5qX2pvdXJuYWwpOworCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCXVwX3dyaXRlKCZqb3VybmFsLT5qX3RyYW5zX2JhcnJpZXIpOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAogCWRvd25fcmVhZCgmb3NiLT5qb3VybmFsLT5qX3RyYW5zX2JhcnJpZXIpOwogCi0JaGFuZGxlID0gam91cm5hbF9zdGFydChqb3VybmFsLCBtYXhfYnVmZnMpOworCWhhbmRsZSA9IGpiZDJfam91cm5hbF9zdGFydChqb3VybmFsLCBtYXhfYnVmZnMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQl1cF9yZWFkKCZvc2ItPmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKQEAgLTI5MCw3ICsyOTAsNyBAQAogCiAJQlVHX09OKCFoYW5kbGUpOwogCi0JcmV0ID0gam91cm5hbF9zdG9wKGhhbmRsZSk7CisJcmV0ID0gamJkMl9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC0zMDQsNyArMzA0LDcgQEAKICAqIHRyYW5zYWN0aW9uLiBleHRlbmRfdHJhbnMgd2lsbCBlaXRoZXIgZXh0ZW5kIHRoZSBjdXJyZW50IGhhbmRsZSBieQogICogbmJsb2Nrcywgb3IgY29tbWl0IGl0IGFuZCBzdGFydCBhIG5ldyBvbmUgd2l0aCBuYmxvY2tzIGNyZWRpdHMuCiAgKgotICogVGhpcyBtaWdodCBjYWxsIGpvdXJuYWxfcmVzdGFydCgpIHdoaWNoIHdpbGwgY29tbWl0IGRpcnR5IGJ1ZmZlcnMKKyAqIFRoaXMgbWlnaHQgY2FsbCBqYmQyX2pvdXJuYWxfcmVzdGFydCgpIHdoaWNoIHdpbGwgY29tbWl0IGRpcnR5IGJ1ZmZlcnMKICAqIGFuZCB0aGVuIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uLiBCZWZvcmUgY2FsbGluZwogICogb2NmczJfZXh0ZW5kX3RyYW5zKCksIGFueSBjaGFuZ2VkIGJsb2NrcyBzaG91bGQgaGF2ZSBiZWVuCiAgKiBkaXJ0aWVkLiBBZnRlciBjYWxsaW5nIGl0LCBhbGwgYmxvY2tzIHdoaWNoIG5lZWQgdG8gYmUgY2hhbmdlZCBtdXN0CkBAIC0zMzIsNyArMzMyLDcgQEAKICNpZmRlZiBDT05GSUdfT0NGUzJfREVCVUdfRlMKIAlzdGF0dXMgPSAxOwogI2Vsc2UKLQlzdGF0dXMgPSBqb3VybmFsX2V4dGVuZChoYW5kbGUsIG5ibG9ja3MpOworCXN0YXR1cyA9IGpiZDJfam91cm5hbF9leHRlbmQoaGFuZGxlLCBuYmxvY2tzKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTM0MCw4ICszNDAsMTAgQEAKICNlbmRpZgogCiAJaWYgKHN0YXR1cyA+IDApIHsKLQkJbWxvZygwLCAiam91cm5hbF9leHRlbmQgZmFpbGVkLCB0cnlpbmcgam91cm5hbF9yZXN0YXJ0XG4iKTsKLQkJc3RhdHVzID0gam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgbmJsb2Nrcyk7CisJCW1sb2coMCwKKwkJICAgICAiamJkMl9qb3VybmFsX2V4dGVuZCBmYWlsZWQsIHRyeWluZyAiCisJCSAgICAgImpiZDJfam91cm5hbF9yZXN0YXJ0XG4iKTsKKwkJc3RhdHVzID0gamJkMl9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBuYmxvY2tzKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTM5MywxMSArMzk1LDExIEBACiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEU6CiAJY2FzZSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURToKLQkJc3RhdHVzID0gam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1VORE86Ci0JCXN0YXR1cyA9IGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYmgpOworCQlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYmgpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00MjIsNyArNDI0LDcgQEAKIAltbG9nX2VudHJ5KCIoYmgtPmJfYmxvY2tucj0lbGx1KVxuIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKIAotCXN0YXR1cyA9IGpvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJc3RhdHVzID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nKE1MX0VSUk9SLCAiQ291bGQgbm90IGRpcnR5IG1ldGFkYXRhIGJ1ZmZlci4gIgogCQkgICAgICIoYmgtPmJfYmxvY2tucj0lbGx1KVxuIiwKQEAgLTQzMiw2ICs0MzQsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKyNpZmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAogaW50IG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewpAQCAtNDQzLDggKzQ0Niw5IEBACiAKIAlyZXR1cm4gZXJyOwogfQorI2VuZGlmCiAKLSNkZWZpbmUgT0NGUzJfREVGQVVMVF9DT01NSVRfSU5URVJWQUwgCShIWiAqIEpCRF9ERUZBVUxUX01BWF9DT01NSVRfQUdFKQorI2RlZmluZSBPQ0ZTMl9ERUZBVUxUX0NPTU1JVF9JTlRFUlZBTAkoSFogKiBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UpCiAKIHZvaWQgb2NmczJfc2V0X2pvdXJuYWxfcGFyYW1zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQogewpAQCAtNDU3LDkgKzQ2MSw5IEBACiAJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gY29tbWl0X2ludGVydmFsOwogCWlmIChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfQkFSUklFUikKLQkJam91cm5hbC0+al9mbGFncyB8PSBKRlNfQkFSUklFUjsKKwkJam91cm5hbC0+al9mbGFncyB8PSBKQkQyX0JBUlJJRVI7CiAJZWxzZQotCQlqb3VybmFsLT5qX2ZsYWdzICY9IH5KRlNfQkFSUklFUjsKKwkJam91cm5hbC0+al9mbGFncyAmPSB+SkJEMl9CQVJSSUVSOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogfQogCkBAIC01MjQsMTQgKzUyOCwxNCBAQAogCW1sb2coMCwgImlub2RlLT5pcF9jbHVzdGVycyA9ICV1XG4iLCBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOwogCiAJLyogY2FsbCB0aGUga2VybmVscyBqb3VybmFsIGluaXQgZnVuY3Rpb24gbm93ICovCi0Jal9qb3VybmFsID0gam91cm5hbF9pbml0X2lub2RlKGlub2RlKTsKKwlqX2pvdXJuYWwgPSBqYmQyX2pvdXJuYWxfaW5pdF9pbm9kZShpbm9kZSk7CiAJaWYgKGpfam91cm5hbCA9PSBOVUxMKSB7CiAJCW1sb2coTUxfRVJST1IsICJMaW51eCBqb3VybmFsIGxheWVyIGVycm9yXG4iKTsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KIAotCW1sb2coMCwgIlJldHVybmVkIGZyb20gam91cm5hbF9pbml0X2lub2RlXG4iKTsKKwltbG9nKDAsICJSZXR1cm5lZCBmcm9tIGpiZDJfam91cm5hbF9pbml0X2lub2RlXG4iKTsKIAltbG9nKDAsICJqX2pvdXJuYWwtPmpfbWF4bGVuID0gJXVcbiIsIGpfam91cm5hbC0+al9tYXhsZW4pOwogCiAJKmRpcnR5ID0gKGxlMzJfdG9fY3B1KGRpLT5pZDEuam91cm5hbDEuaWpfZmxhZ3MpICYKQEAgLTU1MCw4ICs1NTQsNyBAQAogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChpbm9kZV9sb2NrKQogCQkJb2NmczJfaW5vZGVfdW5sb2NrKGlub2RlLCAxKTsKLQkJaWYgKGJoICE9IE5VTEwpCi0JCQlicmVsc2UoYmgpOworCQlicmVsc2UoYmgpOwogCQlpZiAoaW5vZGUpIHsKIAkJCU9DRlMyX0koaW5vZGUpLT5pcF9vcGVuX2NvdW50LS07CiAJCQlpcHV0KGlub2RlKTsKQEAgLTYzOSw3ICs2NDIsNyBAQAogCWlmIChqb3VybmFsLT5qX3N0YXRlICE9IE9DRlMyX0pPVVJOQUxfTE9BREVEKQogCQlnb3RvIGRvbmU7CiAKLQkvKiBuZWVkIHRvIGluYyBpbm9kZSB1c2UgY291bnQgYXMgam91cm5hbF9kZXN0cm95IHdpbGwgaXB1dC4gKi8KKwkvKiBuZWVkIHRvIGluYyBpbm9kZSB1c2UgY291bnQgLSBqYmQyX2pvdXJuYWxfZGVzdHJveSB3aWxsIGlwdXQuICovCiAJaWYgKCFpZ3JhYihpbm9kZSkpCiAJCUJVRygpOwogCkBAIC02NjgsOSArNjcxLDkgQEAKIAlCVUdfT04oYXRvbWljX3JlYWQoJihvc2ItPmpvdXJuYWwtPmpfbnVtX3RyYW5zKSkgIT0gMCk7CiAKIAlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkgewotCQlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOwotCQlzdGF0dXMgPSBqb3VybmFsX2ZsdXNoKGpvdXJuYWwtPmpfam91cm5hbCk7Ci0JCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbC0+al9qb3VybmFsKTsKKwkJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOworCQlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbC0+al9qb3VybmFsKTsKKwkJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwtPmpfam91cm5hbCk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCX0KQEAgLTY4Niw3ICs2ODksNyBAQAogCX0KIAogCS8qIFNodXRkb3duIHRoZSBrZXJuZWwgam91cm5hbCBzeXN0ZW0gKi8KLQlqb3VybmFsX2Rlc3Ryb3koam91cm5hbC0+al9qb3VybmFsKTsKKwlqYmQyX2pvdXJuYWxfZGVzdHJveShqb3VybmFsLT5qX2pvdXJuYWwpOwogCiAJT0NGUzJfSShpbm9kZSktPmlwX29wZW5fY291bnQtLTsKIApAQCAtNzExLDE1ICs3MTQsMTUgQEAKIHsKIAlpbnQgb2xkZXJyOwogCi0Jb2xkZXJyID0gam91cm5hbF9lcnJubyhqb3VybmFsKTsKKwlvbGRlcnIgPSBqYmQyX2pvdXJuYWxfZXJybm8oam91cm5hbCk7CiAJaWYgKG9sZGVycikgewogCQltbG9nKE1MX0VSUk9SLCAiRmlsZSBzeXN0ZW0gZXJyb3IgJWQgcmVjb3JkZWQgaW4gIgogCQkgICAgICJqb3VybmFsICV1LlxuIiwgb2xkZXJyLCBzbG90KTsKIAkJbWxvZyhNTF9FUlJPUiwgIkZpbGUgc3lzdGVtIG9uIGRldmljZSAlcyBuZWVkcyBjaGVja2luZy5cbiIsCiAJCSAgICAgc2ItPnNfaWQpOwogCi0JCWpvdXJuYWxfYWNrX2Vycihqb3VybmFsKTsKLQkJam91cm5hbF9jbGVhcl9lcnIoam91cm5hbCk7CisJCWpiZDJfam91cm5hbF9hY2tfZXJyKGpvdXJuYWwpOworCQlqYmQyX2pvdXJuYWxfY2xlYXJfZXJyKGpvdXJuYWwpOwogCX0KIH0KIApAQCAtNzM0LDcgKzczNyw3IEBACiAKIAlvc2IgPSBqb3VybmFsLT5qX29zYjsKIAotCXN0YXR1cyA9IGpvdXJuYWxfbG9hZChqb3VybmFsLT5qX2pvdXJuYWwpOworCXN0YXR1cyA9IGpiZDJfam91cm5hbF9sb2FkKGpvdXJuYWwtPmpfam91cm5hbCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZyhNTF9FUlJPUiwgIkZhaWxlZCB0byBsb2FkIGpvdXJuYWwhXG4iKTsKIAkJZ290byBkb25lOwpAQCAtNzc4LDcgKzc4MSw3IEBACiAKIAlCVUdfT04oIWpvdXJuYWwpOwogCi0Jc3RhdHVzID0gam91cm5hbF93aXBlKGpvdXJuYWwtPmpfam91cm5hbCwgZnVsbCk7CisJc3RhdHVzID0gamJkMl9qb3VybmFsX3dpcGUoam91cm5hbC0+al9qb3VybmFsLCBmdWxsKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTg0Nyw5ICs4NTAsOCBAQAogCiAJCS8qIFdlIGFyZSByZWFkaW5nIGpvdXJuYWwgZGF0YSB3aGljaCBzaG91bGQgbm90CiAJCSAqIGJlIHB1dCBpbiB0aGUgdXB0b2RhdGUgY2FjaGUgKi8KLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCQkgICBwX2Jsa25vLCBwX2Jsb2NrcywgYmhzLCAwLAotCQkJCQkgICBOVUxMKTsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3Nfc3luYyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCisJCQkJCQlwX2Jsa25vLCBwX2Jsb2NrcywgYmhzKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTg2NSw4ICs4NjcsNyBAQAogCiBiYWlsOgogCWZvcihpID0gMDsgaSA8IENPTkNVUlJFTlRfSk9VUk5BTF9GSUxMOyBpKyspCi0JCWlmIChiaHNbaV0pCi0JCQlicmVsc2UoYmhzW2ldKTsKKwkJYnJlbHNlKGJoc1tpXSk7CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExMzMsNyArMTEzNCw4IEBACiAJfQogCVNFVF9JTk9ERV9KT1VSTkFMKGlub2RlKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGJoLCAwLCBpbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgMSwgYmgsCisJCQkJICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTEyMjksMTkgKzEyMzEsMTkgQEAKIAl9CiAKIAltbG9nKDAsICJjYWxsaW5nIGpvdXJuYWxfaW5pdF9pbm9kZVxuIik7Ci0Jam91cm5hbCA9IGpvdXJuYWxfaW5pdF9pbm9kZShpbm9kZSk7CisJam91cm5hbCA9IGpiZDJfam91cm5hbF9pbml0X2lub2RlKGlub2RlKTsKIAlpZiAoam91cm5hbCA9PSBOVUxMKSB7CiAJCW1sb2coTUxfRVJST1IsICJMaW51eCBqb3VybmFsIGxheWVyIGVycm9yXG4iKTsKIAkJc3RhdHVzID0gLUVJTzsKIAkJZ290byBkb25lOwogCX0KIAotCXN0YXR1cyA9IGpvdXJuYWxfbG9hZChqb3VybmFsKTsKKwlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfbG9hZChqb3VybmFsKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWlmICghaWdyYWIoaW5vZGUpKQogCQkJQlVHKCk7Ci0JCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKKwkJamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTEyNDksOSArMTI1MSw5IEBACiAKIAkvKiB3aXBlIHRoZSBqb3VybmFsICovCiAJbWxvZygwLCAiZmx1c2hpbmcgdGhlIGpvdXJuYWwuXG4iKTsKLQlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKLQlzdGF0dXMgPSBqb3VybmFsX2ZsdXNoKGpvdXJuYWwpOwotCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCk7CisJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKQEAgLTEyNzIsNyArMTI3NCw3IEBACiAJaWYgKCFpZ3JhYihpbm9kZSkpCiAJCUJVRygpOwogCi0Jam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOworCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCiBkb25lOgogCS8qIGRyb3AgdGhlIGxvY2sgb24gdGhpcyBub2RlcyBqb3VybmFsICovCkBAIC0xMjgyLDggKzEyODQsNyBAQAogCWlmIChpbm9kZSkKIAkJaXB1dChpbm9kZSk7CiAKLQlpZiAoYmgpCi0JCWJyZWxzZShiaCk7CisJYnJlbHNlKGJoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmggYi9mcy9vY2ZzMi9qb3VybmFsLmgKaW5kZXggMjE3OGViZi4uZDRkMTRlOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5oCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuaApAQCAtMjcsNyArMjcsMTIgQEAKICNkZWZpbmUgT0NGUzJfSk9VUk5BTF9ICiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2lmbmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAorIyBpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyMgaW5jbHVkZSAib2NmczJfamJkX2NvbXBhdC5oIgorI2VuZGlmCiAKIGVudW0gb2NmczJfam91cm5hbF9zdGF0ZSB7CiAJT0NGUzJfSk9VUk5BTF9GUkVFID0gMCwKQEAgLTIxNSw4ICsyMjAsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci4gV2lsbCBoYXZlIHRvIGNhbGwgb2NmczJfam91cm5hbF9kaXJ0eSBvbmNlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2UndmUgYWN0dWFsbHkgZGlydGllZCBpdC4gVHlwZSBpcyBvbmUgb2YgLiBvciAuCiAgKiAgb2NmczJfam91cm5hbF9kaXJ0eSAgICAtIE1hcmsgYSBqb3VybmFsbGVkIGJ1ZmZlciBhcyBoYXZpbmcgZGlydHkgZGF0YS4KLSAqICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEgLSBJbmRpY2F0ZSB0aGF0IGEgZGF0YSBidWZmZXIgc2hvdWxkIGdvIG91dCBiZWZvcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBoYW5kbGUgY29tbWl0cy4KKyAqICBvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUgIC0gTWFyayBhbiBpbm9kZSBzbyB0aGF0IGl0cyBkYXRhIGdvZXMgb3V0IGJlZm9yZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBoYW5kbGUgY29tbWl0cy4KICAqLwogCiAvKiBZb3UgbXVzdCBhbHdheXMgc3RhcnRfdHJhbnMgd2l0aCBhIG51bWJlciBvZiBidWZmcyA+IDAsIGJ1dCBpdCdzCkBAIC0yNjgsOCArMjczLDEwIEBACiAgKi8KIGludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECiBpbnQgICAgICAgICAgICAgICAgICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisjZW5kaWYKIAogLyoKICAqICBDcmVkaXQgTWFjcm9zOgpAQCAtMjgzLDYgKzI5MCw5IEBACiAvKiBzaW1wbGUgZmlsZSB1cGRhdGVzIGxpa2UgY2htb2QsIGV0Yy4gKi8KICNkZWZpbmUgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgMQogCisvKiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgdXBkYXRlICovCisjZGVmaW5lIE9DRlMyX1hBVFRSX0JMT0NLX1VQREFURV9DUkVESVRTIDEKKwogLyogZ3JvdXAgZXh0ZW5kLiBpbm9kZSB1cGRhdGUgYW5kIGxhc3QgZ3JvdXAgdXBkYXRlLiAqLwogI2RlZmluZSBPQ0ZTMl9HUk9VUF9FWFRFTkRfQ1JFRElUUwkoT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAxKQogCkBAIC0zNDAsMTEgKzM1MCwyMyBAQAogI2RlZmluZSBPQ0ZTMl9SRU5BTUVfQ1JFRElUUyAoMyAqIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMyAgICAgICAgICAgICAgXAogCQkJICAgICArIE9DRlMyX1VOTElOS19DUkVESVRTKQogCisvKiBnbG9iYWwgYml0bWFwIGRpbm9kZSwgZ3JvdXAgZGVzYy4sIHJlbGlua2VkIGdyb3VwLAorICogc3ViYWxsb2NhdG9yIGRpbm9kZSwgZ3JvdXAgZGVzYy4sIHJlbGlua2VkIGdyb3VwLAorICogZGlub2RlLCB4YXR0ciBibG9jayAqLworI2RlZmluZSBPQ0ZTMl9YQVRUUl9CTE9DS19DUkVBVEVfQ1JFRElUUyAoT0NGUzJfU1VCQUxMT0NfQUxMT0MgKiAyICsgXAorCQkJCQkgICsgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgXAorCQkJCQkgICsgT0NGUzJfWEFUVFJfQkxPQ0tfVVBEQVRFX0NSRURJVFMpCisKKy8qCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCByb290X2VsIGlzIHRoZSByb290CisgKiBvZiBleHRlbnQgdHJlZS4gU28gZm9yIGFuIGlub2RlLCBpdCBzaG91bGQgYmUgJmZlLT5pZDIuaV9saXN0LiBPdGhlcndpc2UKKyAqIHRoZSByZXN1bHQgbWF5IGJlIHdyb25nLgorICovCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSwKKwkJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCwKIAkJCQkJICAgIHUzMiBiaXRzX3dhbnRlZCkKIHsKLQlpbnQgYml0bWFwX2Jsb2Nrcywgc3lzZmlsZV9iaXRtYXBfYmxvY2tzLCBkaW5vZGVfYmxvY2tzOworCWludCBiaXRtYXBfYmxvY2tzLCBzeXNmaWxlX2JpdG1hcF9ibG9ja3MsIGV4dGVudF9ibG9ja3M7CiAKIAkvKiBiaXRtYXAgZGlub2RlLCBncm91cCBkZXNjLiArIHJlbGlua2VkIGdyb3VwLiAqLwogCWJpdG1hcF9ibG9ja3MgPSBPQ0ZTMl9TVUJBTExPQ19BTExPQzsKQEAgLTM1NSwxNiArMzc3LDE2IEBACiAJICogaG93ZXZlciBtYW55IG1ldGFkYXRhIGNodW5rcyBuZWVkZWQgKiBhIHJlbWFpbmluZyBzdWJhbGxvYwogCSAqIGFsbG9jLiAqLwogCXN5c2ZpbGVfYml0bWFwX2Jsb2NrcyA9IDEgKwotCQkoT0NGUzJfU1VCQUxMT0NfQUxMT0MgLSAxKSAqIG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChmZSk7CisJCShPQ0ZTMl9TVUJBTExPQ19BTExPQyAtIDEpICogb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKHJvb3RfZWwpOwogCiAJLyogdGhpcyBkb2VzIG5vdCBpbmNsdWRlICpuZXcqIG1ldGFkYXRhIGJsb2Nrcywgd2hpY2ggYXJlCi0JICogYWNjb3VudGVkIGZvciBpbiBzeXNmaWxlX2JpdG1hcF9ibG9ja3MuIGZlICsKKwkgKiBhY2NvdW50ZWQgZm9yIGluIHN5c2ZpbGVfYml0bWFwX2Jsb2Nrcy4gcm9vdF9lbCArCiAJICogcHJldi4gbGFzdF9lYl9ibGsgKyBibG9ja3MgYWxvbmcgZWRnZSBvZiB0cmVlLgogCSAqIGNhbGNfc3ltbGlua19jcmVkaXRzIHBhc3NlcyBiZWNhdXNlIHdlIGp1c3QgbmVlZCAxCiAJICogY3JlZGl0IGZvciB0aGUgZGlub2RlIHRoZXJlLiAqLwotCWRpbm9kZV9ibG9ja3MgPSAxICsgMSArIGxlMTZfdG9fY3B1KGZlLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCk7CisJZXh0ZW50X2Jsb2NrcyA9IDEgKyAxICsgbGUxNl90b19jcHUocm9vdF9lbC0+bF90cmVlX2RlcHRoKTsKIAotCXJldHVybiBiaXRtYXBfYmxvY2tzICsgc3lzZmlsZV9iaXRtYXBfYmxvY2tzICsgZGlub2RlX2Jsb2NrczsKKwlyZXR1cm4gYml0bWFwX2Jsb2NrcyArIHN5c2ZpbGVfYml0bWFwX2Jsb2NrcyArIGV4dGVudF9ibG9ja3M7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2NhbGNfc3ltbGlua19jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC00MTUsNCArNDM3LDE2IEBACiAJcmV0dXJuIGNyZWRpdHM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2piZDJfZmlsZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBqYmQyX2pvdXJuYWxfZmlsZV9pbm9kZShoYW5kbGUsICZPQ0ZTMl9JKGlub2RlKS0+aXBfamlub2RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICAgbG9mZl90IG5ld19zaXplKQoreworCXJldHVybiBqYmQyX2pvdXJuYWxfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2ppbm9kZSwKKwkJCQkJCSAgIG5ld19zaXplKTsKK30KKwogI2VuZGlmIC8qIE9DRlMyX0pPVVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbG9jYWxhbGxvYy5jIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5jCmluZGV4IDI4ZTQ5MmUuLjY4N2IyODcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuYworKysgYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0RJU0tfQUxMT0MKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KQEAgLTQ3LDggKzQ4LDYgQEAKIAogI2RlZmluZSBPQ0ZTMl9MT0NBTF9BTExPQyhkaW5vZGUpCSgmKChkaW5vZGUpLT5pZDIuaV9sYWIpKQogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7Ci0KIHN0YXRpYyB1MzIgb2NmczJfbG9jYWxfYWxsb2NfY291bnRfYml0cyhzdHJ1Y3Qgb2NmczJfZGlub2RlICphbGxvYyk7CiAKIHN0YXRpYyBpbnQgb2NmczJfbG9jYWxfYWxsb2NfZmluZF9jbGVhcl9iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLApAQCAtNzUsMjQgKzc0LDEyOSBAQAogc3RhdGljIGludCBvY2ZzMl9sb2NhbF9hbGxvY19zbGlkZV93aW5kb3coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSAgc3RydWN0IGlub2RlICpsb2NhbF9hbGxvY19pbm9kZSk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2xvY2FsX2FsbG9jX3dpbmRvd19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQotewotCUJVR19PTihvc2ItPnNfY2x1c3RlcnNpemVfYml0cyA+IDIwKTsKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfU1RBVFMKIAotCS8qIFNpemUgbG9jYWwgYWxsb2Mgd2luZG93cyBieSB0aGUgbWVnYWJ5dGUgKi8KLQlyZXR1cm4gb3NiLT5sb2NhbF9hbGxvY19zaXplIDw8ICgyMCAtIG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKTsKK3N0YXRpYyBpbnQgb2NmczJfbGFfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCisjZGVmaW5lIExBX0RFQlVHX0JVRl9TWglQQUdFX0NBQ0hFX1NJWkUKKyNkZWZpbmUgTEFfREVCVUdfVkVSCTEKK3N0YXRpYyBzc2l6ZV90IG9jZnMyX2xhX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0YXRpYyBERUZJTkVfTVVURVgobGFfZGVidWdfbXV0ZXgpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCB3cml0dGVuLCByZXQ7CisJY2hhciAqYnVmID0gb3NiLT5sb2NhbF9hbGxvY19kZWJ1Z19idWY7CisKKwltdXRleF9sb2NrKCZsYV9kZWJ1Z19tdXRleCk7CisJbWVtc2V0KGJ1ZiwgMCwgTEFfREVCVUdfQlVGX1NaKTsKKworCXdyaXR0ZW4gPSBzbnByaW50ZihidWYsIExBX0RFQlVHX0JVRl9TWiwKKwkJCSAgICIweCV4XHQweCVsbHhcdCV1XHQldVx0MHgleFxuIiwKKwkJCSAgIExBX0RFQlVHX1ZFUiwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpb3NiLT5sYV9sYXN0X2dkLAorCQkJICAgb3NiLT5sb2NhbF9hbGxvY19kZWZhdWx0X2JpdHMsCisJCQkgICBvc2ItPmxvY2FsX2FsbG9jX2JpdHMsIG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1Ziwgd3JpdHRlbik7CisKKwltdXRleF91bmxvY2soJmxhX2RlYnVnX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9sYV9kZWJ1Z19mb3BzID0geworCS5vcGVuID0JCW9jZnMyX2xhX2RlYnVnX29wZW4sCisJLnJlYWQgPQkJb2NmczJfbGFfZGVidWdfcmVhZCwKK307CisKK3N0YXRpYyB2b2lkIG9jZnMyX2luaXRfbGFfZGVidWcoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJb3NiLT5sb2NhbF9hbGxvY19kZWJ1Z19idWYgPSBrbWFsbG9jKExBX0RFQlVHX0JVRl9TWiwgR0ZQX05PRlMpOworCWlmICghb3NiLT5sb2NhbF9hbGxvY19kZWJ1Z19idWYpCisJCXJldHVybjsKKworCW9zYi0+bG9jYWxfYWxsb2NfZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJsb2NhbF9hbGxvY19zdGF0cyIsCisJCQkJCQkgICAgIFNfSUZSRUd8U19JUlVTUiwKKwkJCQkJCSAgICAgb3NiLT5vc2JfZGVidWdfcm9vdCwKKwkJCQkJCSAgICAgb3NiLAorCQkJCQkJICAgICAmb2NmczJfbGFfZGVidWdfZm9wcyk7CisJaWYgKCFvc2ItPmxvY2FsX2FsbG9jX2RlYnVnKSB7CisJCWtmcmVlKG9zYi0+bG9jYWxfYWxsb2NfZGVidWdfYnVmKTsKKwkJb3NiLT5sb2NhbF9hbGxvY19kZWJ1Z19idWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgb2NmczJfc2h1dGRvd25fbGFfZGVidWcoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJaWYgKG9zYi0+bG9jYWxfYWxsb2NfZGVidWcpCisJCWRlYnVnZnNfcmVtb3ZlKG9zYi0+bG9jYWxfYWxsb2NfZGVidWcpOworCisJaWYgKG9zYi0+bG9jYWxfYWxsb2NfZGVidWdfYnVmKQorCQlrZnJlZShvc2ItPmxvY2FsX2FsbG9jX2RlYnVnX2J1Zik7CisKKwlvc2ItPmxvY2FsX2FsbG9jX2RlYnVnX2J1ZiA9IE5VTEw7CisJb3NiLT5sb2NhbF9hbGxvY19kZWJ1ZyA9IE5VTEw7Cit9CisjZWxzZQkvKiBDT05GSUdfT0NGUzJfRlNfU1RBVFMgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX2luaXRfbGFfZGVidWcoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJcmV0dXJuOworfQorc3RhdGljIHZvaWQgb2NmczJfc2h1dGRvd25fbGFfZGVidWcoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJcmV0dXJuOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2xhX3N0YXRlX2VuYWJsZWQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJcmV0dXJuIChvc2ItPmxvY2FsX2FsbG9jX3N0YXRlID09IE9DRlMyX0xBX1RIUk9UVExFRCB8fAorCQlvc2ItPmxvY2FsX2FsbG9jX3N0YXRlID09IE9DRlMyX0xBX0VOQUJMRUQpOworfQorCit2b2lkIG9jZnMyX2xvY2FsX2FsbG9jX3NlZW5fZnJlZV9iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpCit7CisJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwlpZiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9ESVNBQkxFRCB8fAorCSAgICBvc2ItPmxvY2FsX2FsbG9jX3N0YXRlID09IE9DRlMyX0xBX1RIUk9UVExFRCkKKwkJaWYgKG51bV9jbHVzdGVycyA+PSBvc2ItPmxvY2FsX2FsbG9jX2RlZmF1bHRfYml0cykgeworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmb3NiLT5sYV9lbmFibGVfd3EpOworCQkJb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9IE9DRlMyX0xBX0VOQUJMRUQ7CisJCX0KKwlzcGluX3VubG9jaygmb3NiLT5vc2JfbG9jayk7Cit9CisKK3ZvaWQgb2NmczJfbGFfZW5hYmxlX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9jZnMyX3N1cGVyLAorCQkJICAgICBsYV9lbmFibGVfd3Eud29yayk7CisJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwlvc2ItPmxvY2FsX2FsbG9jX3N0YXRlID0gT0NGUzJfTEFfRU5BQkxFRDsKKwlzcGluX3VubG9jaygmb3NiLT5vc2JfbG9jayk7CiB9CiAKIC8qCiAgKiBUZWxsIHVzIHdoZXRoZXIgYSBnaXZlbiBhbGxvY2F0aW9uIHNob3VsZCB1c2UgdGhlIGxvY2FsIGFsbG9jCiAgKiBmaWxlLiBPdGhlcndpc2UsIGl0IGhhcyB0byBnbyB0byB0aGUgbWFpbiBiaXRtYXAuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIHNlbWktZGlydHkgcmVhZHMgb2YgbG9jYWwgYWxsb2Mgc2l6ZSBhbmQgc3RhdGUhCisgKiBUaGlzIGlzIG9rIGhvd2V2ZXIsIGFzIHRoZSB2YWx1ZXMgYXJlIHJlLWNoZWNrZWQgb25jZSB1bmRlciBtdXRleC4KICAqLwogaW50IG9jZnMyX2FsbG9jX3Nob3VsZF91c2VfbG9jYWwoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHU2NCBiaXRzKQogewotCWludCBsYV9iaXRzID0gb2NmczJfbG9jYWxfYWxsb2Nfd2luZG93X2JpdHMob3NiKTsKIAlpbnQgcmV0ID0gMDsKKwlpbnQgbGFfYml0czsKIAotCWlmIChvc2ItPmxvY2FsX2FsbG9jX3N0YXRlICE9IE9DRlMyX0xBX0VOQUJMRUQpCisJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwlsYV9iaXRzID0gb3NiLT5sb2NhbF9hbGxvY19iaXRzOworCisJaWYgKCFvY2ZzMl9sYV9zdGF0ZV9lbmFibGVkKG9zYikpCiAJCWdvdG8gYmFpbDsKIAogCS8qIGxhX2JpdHMgc2hvdWxkIGJlIGF0IGxlYXN0IHR3aWNlIHRoZSBzaXplIChpbiBjbHVzdGVycykgb2YKQEAgLTEwNiw2ICsyMTAsNyBAQAogYmFpbDoKIAltbG9nKDAsICJzdGF0ZT0lZCwgYml0cz0lbGx1LCBsYV9iaXRzPSVkLCByZXQ9JWRcbiIsCiAJICAgICBvc2ItPmxvY2FsX2FsbG9jX3N0YXRlLCAodW5zaWduZWQgbG9uZyBsb25nKWJpdHMsIGxhX2JpdHMsIHJldCk7CisJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyMCwxNCArMjI1LDE4IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCWlmIChvc2ItPmxvY2FsX2FsbG9jX3NpemUgPT0gMCkKKwlvY2ZzMl9pbml0X2xhX2RlYnVnKG9zYik7CisKKwlpZiAob3NiLT5sb2NhbF9hbGxvY19iaXRzID09IDApCiAJCWdvdG8gYmFpbDsKIAotCWlmIChvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhvc2IpID49IG9zYi0+Yml0bWFwX2NwZykgeworCWlmIChvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPj0gb3NiLT5iaXRtYXBfY3BnKSB7CiAJCW1sb2coTUxfTk9USUNFLCAiUmVxdWVzdGVkIGxvY2FsIGFsbG9jIHdpbmRvdyAlZCBpcyBsYXJnZXIgIgogCQkgICAgICJ0aGFuIG1heCBwb3NzaWJsZSAldS4gVXNpbmcgZGVmYXVsdHMuXG4iLAotCQkgICAgIG9jZnMyX2xvY2FsX2FsbG9jX3dpbmRvd19iaXRzKG9zYiksIChvc2ItPmJpdG1hcF9jcGcgLSAxKSk7Ci0JCW9zYi0+bG9jYWxfYWxsb2Nfc2l6ZSA9IE9DRlMyX0RFRkFVTFRfTE9DQUxfQUxMT0NfU0laRTsKKwkJICAgICBvc2ItPmxvY2FsX2FsbG9jX2JpdHMsIChvc2ItPmJpdG1hcF9jcGcgLSAxKSk7CisJCW9zYi0+bG9jYWxfYWxsb2NfYml0cyA9CisJCQlvY2ZzMl9tZWdhYnl0ZXNfdG9fY2x1c3RlcnMob3NiLT5zYiwKKwkJCQkJCSAgICBPQ0ZTMl9ERUZBVUxUX0xPQ0FMX0FMTE9DX1NJWkUpOwogCX0KIAogCS8qIHJlYWQgdGhlIGFsbG9jIG9mZiBkaXNrICovCkBAIC0xMzksOCArMjQ4LDggQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJICAmYWxsb2NfYmgsIDAsIGlub2RlKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAxLAorCQkJCSAgICZhbGxvY19iaCwgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTE4NSwxMyArMjk0LDE0IEBACiAKIGJhaWw6CiAJaWYgKHN0YXR1cyA8IDApCi0JCWlmIChhbGxvY19iaCkKLQkJCWJyZWxzZShhbGxvY19iaCk7CisJCWJyZWxzZShhbGxvY19iaCk7CiAJaWYgKGlub2RlKQogCQlpcHV0KGlub2RlKTsKIAotCW1sb2coMCwgIkxvY2FsIGFsbG9jIHdpbmRvdyBiaXRzID0gJWRcbiIsCi0JICAgICBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhvc2IpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJb2NmczJfc2h1dGRvd25fbGFfZGVidWcob3NiKTsKKworCW1sb2coMCwgIkxvY2FsIGFsbG9jIHdpbmRvdyBiaXRzID0gJWRcbiIsIG9zYi0+bG9jYWxfYWxsb2NfYml0cyk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMjE3LDYgKzMyNywxMSBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKKwljYW5jZWxfZGVsYXllZF93b3JrKCZvc2ItPmxhX2VuYWJsZV93cSk7CisJZmx1c2hfd29ya3F1ZXVlKG9jZnMyX3dxKTsKKworCW9jZnMyX3NodXRkb3duX2xhX2RlYnVnKG9zYik7CisKIAlpZiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9VTlVTRUQpCiAJCWdvdG8gb3V0OwogCkBAIC0yOTUsOCArNDEwLDcgQEAKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiBvdXRfdW5sb2NrOgotCWlmIChtYWluX2JtX2JoKQotCQlicmVsc2UobWFpbl9ibV9iaCk7CisJYnJlbHNlKG1haW5fYm1fYmgpOwogCiAJb2NmczJfaW5vZGVfdW5sb2NrKG1haW5fYm1faW5vZGUsIDEpOwogCkBAIC0zNDUsOCArNDU5LDggQEAKIAogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJICAmYWxsb2NfYmgsIDAsIGlub2RlKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAxLAorCQkJCSAgICZhbGxvY19iaCwgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTM3Miw4ICs0ODYsNyBAQAogCQkqYWxsb2NfY29weSA9IE5VTEw7CiAJfQogCi0JaWYgKGFsbG9jX2JoKQotCQlicmVsc2UoYWxsb2NfYmgpOworCWJyZWxzZShhbGxvY19iaCk7CiAKIAlpZiAoaW5vZGUpIHsKIAkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CkBAIC00NDEsOCArNTU0LDcgQEAKIG91dF9tdXRleDoKIAltdXRleF91bmxvY2soJm1haW5fYm1faW5vZGUtPmlfbXV0ZXgpOwogCi0JaWYgKG1haW5fYm1fYmgpCi0JCWJyZWxzZShtYWluX2JtX2JoKTsKKwlicmVsc2UobWFpbl9ibV9iaCk7CiAKIAlpcHV0KG1haW5fYm1faW5vZGUpOwogCkBAIC00NTMsOCArNTY1LDQ4IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsb2NhbCBhbGxvYyB3aW5kb3cgaXMgd2l0aGluIGFjLT5hY19tYXhfYmxvY2sgKi8KK3N0YXRpYyBpbnQgb2NmczJfbG9jYWxfYWxsb2NfaW5fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCisJCQkJICAgICAgdTMyIGJpdHNfd2FudGVkKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmFsbG9jOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9hbGxvYyAqbGE7CisJaW50IHN0YXJ0OworCXU2NCBibG9ja19vZmY7CisKKwlpZiAoIWFjLT5hY19tYXhfYmxvY2spCisJCXJldHVybiAxOworCisJYWxsb2MgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBvc2ItPmxvY2FsX2FsbG9jX2JoLT5iX2RhdGE7CisJbGEgPSBPQ0ZTMl9MT0NBTF9BTExPQyhhbGxvYyk7CisKKwlzdGFydCA9IG9jZnMyX2xvY2FsX2FsbG9jX2ZpbmRfY2xlYXJfYml0cyhvc2IsIGFsbG9jLCBiaXRzX3dhbnRlZCk7CisJaWYgKHN0YXJ0ID09IC0xKSB7CisJCW1sb2dfZXJybm8oLUVOT1NQQyk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQ29udmVydGluZyAoYm1fb2ZmICsgc3RhcnQgKyBiaXRzX3dhbnRlZCkgdG8gYmxvY2tzIGdpdmVzIHVzCisJICogdGhlIGJsa25vIGp1c3QgcGFzdCBvdXIgYWN0dWFsIGFsbG9jYXRpb24uICBUaGlzIGlzIHBlcmZlY3QKKwkgKiB0byBjb21wYXJlIHdpdGggYWNfbWF4X2Jsb2NrLgorCSAqLworCWJsb2NrX29mZiA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICBsZTMyX3RvX2NwdShsYS0+bGFfYm1fb2ZmKSArCisJCQkJCSAgICAgc3RhcnQgKyBiaXRzX3dhbnRlZCk7CisJbWxvZygwLCAiQ2hlY2tpbmcgJWxsdSBhZ2FpbnN0ICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrX29mZiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWMtPmFjX21heF9ibG9jayk7CisJaWYgKGJsb2NrX29mZiA+IGFjLT5hY19tYXhfYmxvY2spCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKIC8qCi0gKiBtYWtlIHN1cmUgd2UndmUgZ290IGF0IGxlYXN0IGJpdHN3YW50ZWQgY29udGlndW91cyBiaXRzIGluIHRoZQorICogbWFrZSBzdXJlIHdlJ3ZlIGdvdCBhdCBsZWFzdCBiaXRzX3dhbnRlZCBjb250aWd1b3VzIGJpdHMgaW4gdGhlCiAgKiBsb2NhbCBhbGxvYy4gWW91IGxvc2UgdGhlbSB3aGVuIHlvdSBkcm9wIGlfbXV0ZXguCiAgKgogICogV2Ugd2lsbCBhZGQgb3Vyc2VsdmVzIHRvIHRoZSB0cmFuc2FjdGlvbiBwYXNzZWQgaW4sIGJ1dCBtYXkgc3RhcnQKQEAgLTQ4NSwxNiArNjM3LDE4IEBACiAKIAltdXRleF9sb2NrKCZsb2NhbF9hbGxvY19pbm9kZS0+aV9tdXRleCk7CiAKLQlpZiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSAhPSBPQ0ZTMl9MQV9FTkFCTEVEKSB7CisJLyoKKwkgKiBXZSBtdXN0IGRvdWJsZSBjaGVjayBzdGF0ZSBhbmQgYWxsb2NhdG9yIGJpdHMgYmVjYXVzZQorCSAqIGFub3RoZXIgcHJvY2VzcyBtYXkgaGF2ZSBjaGFuZ2VkIHRoZW0gd2hpbGUgaG9sZGluZyBpX211dGV4LgorCSAqLworCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CisJaWYgKCFvY2ZzMl9sYV9zdGF0ZV9lbmFibGVkKG9zYikgfHwKKwkgICAgKGJpdHNfd2FudGVkID4gb3NiLT5sb2NhbF9hbGxvY19iaXRzKSkgeworCQlzcGluX3VubG9jaygmb3NiLT5vc2JfbG9jayk7CiAJCXN0YXR1cyA9IC1FTk9TUEM7CiAJCWdvdG8gYmFpbDsKIAl9Ci0KLQlpZiAoYml0c193YW50ZWQgPiBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhvc2IpKSB7Ci0JCW1sb2coMCwgIkFza2luZyBmb3IgbW9yZSB0aGFuIG15IG1heCB3aW5kb3cgc2l6ZSFcbiIpOwotCQlzdGF0dXMgPSAtRU5PU1BDOwotCQlnb3RvIGJhaWw7Ci0JfQorCXNwaW5fdW5sb2NrKCZvc2ItPm9zYl9sb2NrKTsKIAogCWFsbG9jID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgb3NiLT5sb2NhbF9hbGxvY19iaC0+Yl9kYXRhOwogCkBAIC01MjIsNiArNjc2LDM2IEBACiAJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9CisKKwkJLyoKKwkJICogVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGUgd2luZG93IHNsaWRlIGNvZGUKKwkJICogbWlnaHQgaGF2ZSByZWR1Y2VkIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgb3IKKwkJICogZGlzYWJsZWQgdGhlIHRoZSBsb2NhbCBhbGxvYyBlbnRpcmVseS4gUmUtY2hlY2sKKwkJICogaGVyZSBhbmQgcmV0dXJuIC1FTk9TUEMgaWYgbmVjZXNzYXJ5LgorCQkgKi8KKwkJc3RhdHVzID0gLUVOT1NQQzsKKwkJaWYgKCFvY2ZzMl9sYV9zdGF0ZV9lbmFibGVkKG9zYikpCisJCQlnb3RvIGJhaWw7CisKKwkJZnJlZV9iaXRzID0gbGUzMl90b19jcHUoYWxsb2MtPmlkMS5iaXRtYXAxLmlfdG90YWwpIC0KKwkJCWxlMzJfdG9fY3B1KGFsbG9jLT5pZDEuYml0bWFwMS5pX3VzZWQpOworCQlpZiAoYml0c193YW50ZWQgPiBmcmVlX2JpdHMpCisJCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKGFjLT5hY19tYXhfYmxvY2spCisJCW1sb2coMCwgIkNhbGxpbmcgaW5fcmFuZ2UgZm9yIG1heCBibG9jayAlbGx1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWMtPmFjX21heF9ibG9jayk7CisKKwlpZiAoIW9jZnMyX2xvY2FsX2FsbG9jX2luX3JhbmdlKGxvY2FsX2FsbG9jX2lub2RlLCBhYywKKwkJCQkJYml0c193YW50ZWQpKSB7CisJCS8qCisJCSAqIFRoZSB3aW5kb3cgaXMgb3V0c2lkZSBhYy0+YWNfbWF4X2Jsb2NrLgorCQkgKiBUaGlzIGVycm5vIHRlbGxzIHRoZSBjYWxsZXIgdG8ga2VlcCBsb2NhbGFsbG9jIGVuYWJsZWQKKwkJICogYnV0IHRvIGdldCB0aGUgYWxsb2NhdGlvbiBmcm9tIHRoZSBtYWluIGJpdG1hcC4KKwkJICovCisJCXN0YXR1cyA9IC1FRkJJRzsKKwkJZ290byBiYWlsOwogCX0KIAogCWFjLT5hY19pbm9kZSA9IGxvY2FsX2FsbG9jX2lub2RlOwpAQCAtNzg5LDYgKzk3Myw4NSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK2VudW0gb2NmczJfbGFfZXZlbnQgeworCU9DRlMyX0xBX0VWRU5UX1NMSURFLAkJLyogTm9ybWFsIHdpbmRvdyBzbGlkZS4gKi8KKwlPQ0ZTMl9MQV9FVkVOVF9GUkFHTUVOVEVELAkvKiBUaGUgZ2xvYmFsIGJpdG1hcCBoYXMKKwkJCQkJICogZW5vdWdoIGJpdHMgdGhlb3JldGljYWxseQorCQkJCQkgKiBmcmVlLCBidXQgYSBjb250aWd1b3VzCisJCQkJCSAqIGFsbG9jYXRpb24gY291bGQgbm90IGJlCisJCQkJCSAqIGZvdW5kLiAqLworCU9DRlMyX0xBX0VWRU5UX0VOT1NQQywJCS8qIEdsb2JhbCBiaXRtYXAgZG9lc24ndCBoYXZlCisJCQkJCSAqIGVub3VnaCBiaXRzIGZyZWUgdG8gc2F0aXNmeQorCQkJCQkgKiBvdXIgcmVxdWVzdC4gKi8KK307CisjZGVmaW5lIE9DRlMyX0xBX0VOQUJMRV9JTlRFUlZBTCAoMzAgKiBIWikKKy8qCisgKiBHaXZlbiBhbiBldmVudCwgY2FsY3VsYXRlIHRoZSBzaXplIG9mIG91ciBuZXh0IGxvY2FsIGFsbG9jIHdpbmRvdy4KKyAqCisgKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHVuZGVyIGlfbXV0ZXggb2YgdGhlIGxvY2FsIGFsbG9jIGlub2RlCisgKiBzbyB0aGF0IGxvY2FsIGFsbG9jIGRpc2FibGluZyBkb2Vzbid0IHJhY2Ugd2l0aCBwcm9jZXNzZXMgdHJ5aW5nIHRvCisgKiB1c2UgdGhlIGFsbG9jYXRvci4KKyAqCisgKiBSZXR1cm5zIHRoZSBzdGF0ZSB3aGljaCB0aGUgbG9jYWwgYWxsb2Mgd2FzIGxlZnQgaW4uIFRoaXMgdmFsdWUgY2FuCisgKiBiZSBpZ25vcmVkIGJ5IHNvbWUgcGF0aHMuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfcmVjYWxjX2xhX3dpbmRvdyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkgIGVudW0gb2NmczJfbGFfZXZlbnQgZXZlbnQpCit7CisJdW5zaWduZWQgaW50IGJpdHM7CisJaW50IHN0YXRlOworCisJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwlpZiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9ESVNBQkxFRCkgeworCQlXQVJOX09OX09OQ0Uob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9ESVNBQkxFRCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKgorCSAqIEVOT1NQQyBhbmQgZnJhZ21lbnRhdGlvbiBhcmUgdHJlYXRlZCBzaW1pbGFybHkgZm9yIG5vdy4KKwkgKi8KKwlpZiAoZXZlbnQgPT0gT0NGUzJfTEFfRVZFTlRfRU5PU1BDIHx8CisJICAgIGV2ZW50ID09IE9DRlMyX0xBX0VWRU5UX0ZSQUdNRU5URUQpIHsKKwkJLyoKKwkJICogV2UgcmFuIG91dCBvZiBjb250aWd1b3VzIHNwYWNlIGluIHRoZSBwcmltYXJ5CisJCSAqIGJpdG1hcC4gRHJhc3RpY2FsbHkgcmVkdWNlIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkCisJCSAqIGJ5IGxvY2FsIGFsbG9jIHVudGlsIHdlIGhhdmUgdG8gZGlzYWJsZSBpdC4KKwkJICovCisJCWJpdHMgPSBvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPj4gMTsKKwkJaWYgKGJpdHMgPiBvY2ZzMl9tZWdhYnl0ZXNfdG9fY2x1c3RlcnMob3NiLT5zYiwgMSkpIHsKKwkJCS8qCisJCQkgKiBCeSBzZXR0aW5nIHN0YXRlIHRvIFRIUk9UVExFRCwgd2UnbGwga2VlcAorCQkJICogdGhlIG51bWJlciBvZiBsb2NhbCBhbGxvYyBiaXRzIHVzZWQgZG93bgorCQkJICogdW50aWwgYW4gZXZlbnQgb2NjdXJzIHdoaWNoIHdvdWxkIGdpdmUgdXMKKwkJCSAqIHJlYXNvbiB0byBhc3N1bWUgdGhlIGJpdG1hcCBzaXR1YXRpb24gbWlnaHQKKwkJCSAqIGhhdmUgY2hhbmdlZC4KKwkJCSAqLworCQkJb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9IE9DRlMyX0xBX1RIUk9UVExFRDsKKwkJCW9zYi0+bG9jYWxfYWxsb2NfYml0cyA9IGJpdHM7CisJCX0gZWxzZSB7CisJCQlvc2ItPmxvY2FsX2FsbG9jX3N0YXRlID0gT0NGUzJfTEFfRElTQUJMRUQ7CisJCX0KKwkJcXVldWVfZGVsYXllZF93b3JrKG9jZnMyX3dxLCAmb3NiLT5sYV9lbmFibGVfd3EsCisJCQkJICAgT0NGUzJfTEFfRU5BQkxFX0lOVEVSVkFMKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qCisJICogRG9uJ3QgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGxvY2FsIGFsbG9jIHdpbmRvdyB1bnRpbCB3ZQorCSAqIGtub3cgd2UgbWlnaHQgYmUgYWJsZSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0LiBPdGhlcndpc2UsIHdlCisJICogcmlzayBib3VuY2luZyBhcm91bmQgdGhlIGdsb2JhbCBiaXRtYXAgZHVyaW5nIHBlcmlvZHMgb2YKKwkgKiBsb3cgc3BhY2UuCisJICovCisJaWYgKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgIT0gT0NGUzJfTEFfVEhST1RUTEVEKQorCQlvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPSBvc2ItPmxvY2FsX2FsbG9jX2RlZmF1bHRfYml0czsKKworb3V0X3VubG9jazoKKwlzdGF0ZSA9IG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGU7CisJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOworCisJcmV0dXJuIHN0YXRlOworfQorCiBzdGF0aWMgaW50IG9jZnMyX2xvY2FsX2FsbG9jX3Jlc2VydmVfZm9yX3dpbmRvdyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMsCiAJCQkJCQlzdHJ1Y3QgaW5vZGUgKipiaXRtYXBfaW5vZGUsCkBAIC04MDMsMTIgKzEwNjYsMjEgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9jZnMyX2xvY2FsX2FsbG9jX3dpbmRvd19iaXRzKG9zYik7CityZXRyeV9lbm9zcGM6CisJKCphYyktPmFjX2JpdHNfd2FudGVkID0gb3NiLT5sb2NhbF9hbGxvY19iaXRzOwogCiAJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVyX2JpdG1hcF9iaXRzKG9zYiwgKmFjKTsKKwlpZiAoc3RhdHVzID09IC1FTk9TUEMpIHsKKwkJaWYgKG9jZnMyX3JlY2FsY19sYV93aW5kb3cob3NiLCBPQ0ZTMl9MQV9FVkVOVF9FTk9TUEMpID09CisJCSAgICBPQ0ZTMl9MQV9ESVNBQkxFRCkKKwkJCWdvdG8gYmFpbDsKKworCQlvY2ZzMl9mcmVlX2FjX3Jlc291cmNlKCphYyk7CisJCW1lbXNldCgqYWMsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCkpOworCQlnb3RvIHJldHJ5X2Vub3NwYzsKKwl9CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQotCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKQEAgLTg0OSw3ICsxMTIxLDcgQEAKIAkJICAgICAib25lXG4iKTsKIAogCW1sb2coMCwgIkFsbG9jYXRpbmcgJXUgY2x1c3RlcnMgZm9yIGEgbmV3IHdpbmRvdy5cbiIsCi0JICAgICBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhvc2IpKTsKKwkgICAgIG9zYi0+bG9jYWxfYWxsb2NfYml0cyk7CiAKIAkvKiBJbnN0cnVjdCB0aGUgYWxsb2NhdGlvbiBjb2RlIHRvIHRyeSB0aGUgbW9zdCByZWNlbnRseSB1c2VkCiAJICogY2x1c3RlciBncm91cC4gV2UnbGwgcmUtcmVjb3JkIHRoZSBncm91cCB1c2VkIHRoaXMgcGFzcwpAQCAtODU5LDkgKzExMzEsMzYgQEAKIAkvKiB3ZSB1c2VkIHRoZSBnZW5lcmljIHN1YmFsbG9jIHJlc2VydmUgZnVuY3Rpb24sIGJ1dCB3ZSBzZXQKIAkgKiBldmVyeXRoaW5nIHVwIG5pY2VseSwgc28gdGhlcmUncyBubyByZWFzb24gd2h5IHdlIGNhbid0IHVzZQogCSAqIHRoZSBtb3JlIHNwZWNpZmljIGNsdXN0ZXIgYXBpIHRvIGNsYWltIGJpdHMuICovCi0Jc3RhdHVzID0gb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGFjLAotCQkJCSAgICAgIG9jZnMyX2xvY2FsX2FsbG9jX3dpbmRvd19iaXRzKG9zYiksCisJc3RhdHVzID0gb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGFjLCBvc2ItPmxvY2FsX2FsbG9jX2JpdHMsCiAJCQkJICAgICAgJmNsdXN0ZXJfb2ZmLCAmY2x1c3Rlcl9jb3VudCk7CisJaWYgKHN0YXR1cyA9PSAtRU5PU1BDKSB7CityZXRyeV9lbm9zcGM6CisJCS8qCisJCSAqIE5vdGU6IFdlIGNvdWxkIGFsc28gdHJ5IHN5bmNpbmcgdGhlIGpvdXJuYWwgaGVyZSB0bworCQkgKiBhbGxvdyB1c2Ugb2YgYW55IGZyZWUgYml0cyB3aGljaCB0aGUgY3VycmVudAorCQkgKiB0cmFuc2FjdGlvbiBjYW4ndCBnaXZlIHVzIGFjY2VzcyB0by4gLS1NYXJrCisJCSAqLworCQlpZiAob2NmczJfcmVjYWxjX2xhX3dpbmRvdyhvc2IsIE9DRlMyX0xBX0VWRU5UX0ZSQUdNRU5URUQpID09CisJCSAgICBPQ0ZTMl9MQV9ESVNBQkxFRCkKKwkJCWdvdG8gYmFpbDsKKworCQlzdGF0dXMgPSBvY2ZzMl9jbGFpbV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgYWMsCisJCQkJCSAgICAgIG9zYi0+bG9jYWxfYWxsb2NfYml0cywKKwkJCQkJICAgICAgJmNsdXN0ZXJfb2ZmLAorCQkJCQkgICAgICAmY2x1c3Rlcl9jb3VudCk7CisJCWlmIChzdGF0dXMgPT0gLUVOT1NQQykKKwkJCWdvdG8gcmV0cnlfZW5vc3BjOworCQkvKgorCQkgKiBXZSBvbmx5IHNocnVuayB0aGUgKm1pbmltdW0qIG51bWJlciBvZiBpbiBvdXIKKwkJICogcmVxdWVzdCAtIGl0J3MgZW50aXJlbHkgcG9zc2libGUgdGhhdCB0aGUgYWxsb2NhdG9yCisJCSAqIG1pZ2h0IGdpdmUgdXMgbW9yZSB0aGFuIHdlIGFza2VkIGZvci4KKwkJICovCisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwkJCW9zYi0+bG9jYWxfYWxsb2NfYml0cyA9IGNsdXN0ZXJfY291bnQ7CisJCQlzcGluX3VubG9jaygmb3NiLT5vc2JfbG9jayk7CisJCX0KKwl9CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtOTA1LDYgKzEyMDQsOCBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKKwlvY2ZzMl9yZWNhbGNfbGFfd2luZG93KG9zYiwgT0NGUzJfTEFfRVZFTlRfU0xJREUpOworCiAJLyogVGhpcyB3aWxsIGxvY2sgdGhlIG1haW4gYml0bWFwIGZvciB1cy4gKi8KIAlzdGF0dXMgPSBvY2ZzMl9sb2NhbF9hbGxvY19yZXNlcnZlX2Zvcl93aW5kb3cob3NiLAogCQkJCQkJICAgICAgJmFjLApAQCAtOTc2LDggKzEyNzcsNyBAQAogCWlmIChoYW5kbGUpCiAJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKLQlpZiAobWFpbl9ibV9iaCkKLQkJYnJlbHNlKG1haW5fYm1fYmgpOworCWJyZWxzZShtYWluX2JtX2JoKTsKIAogCWlmIChtYWluX2JtX2lub2RlKQogCQlpcHV0KG1haW5fYm1faW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbG9jYWxhbGxvYy5oIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5oCmluZGV4IDNmNzY2MzEuLmFjNWVhOWY4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmgKKysrIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5oCkBAIC01Miw0ICs1Miw4IEBACiAJCQkJIHUzMiAqYml0X29mZiwKIAkJCQkgdTMyICpudW1fYml0cyk7CiAKK3ZvaWQgb2NmczJfbG9jYWxfYWxsb2Nfc2Vlbl9mcmVlX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyk7Cit2b2lkIG9jZnMyX2xhX2VuYWJsZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogI2VuZGlmIC8qIE9DRlMyX0xPQ0FMQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbG9ja3MuYyBiL2ZzL29jZnMyL2xvY2tzLmMKaW5kZXggMjAzZjg3MS4uNTQ0YWM2MiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbG9ja3MuYworKysgYi9mcy9vY2ZzMi9sb2Nrcy5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0lOT0RFCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC0zMiw2ICszMyw3IEBACiAKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAibG9ja3MuaCIKIAogc3RhdGljIGludCBvY2ZzMl9kb19mbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTEyMywzICsxMjUsMTYgQEAKIAllbHNlCiAJCXJldHVybiBvY2ZzMl9kb19mbG9jayhmaWxlLCBpbm9kZSwgY21kLCBmbCk7CiB9CisKK2ludCBvY2ZzMl9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJaWYgKCEoZmwtPmZsX2ZsYWdzICYgRkxfUE9TSVgpKQorCQlyZXR1cm4gLUVOT0xDSzsKKwlpZiAoX19tYW5kYXRvcnlfbG9jayhpbm9kZSkpCisJCXJldHVybiAtRU5PTENLOworCisJcmV0dXJuIG9jZnMyX3Bsb2NrKG9zYi0+Y2Nvbm4sIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgZmlsZSwgY21kLCBmbCk7Cit9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9sb2Nrcy5oIGIvZnMvb2NmczIvbG9ja3MuaAppbmRleCA5NzQzZWYyLi40OTZkNDg4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9sb2Nrcy5oCisrKyBiL2ZzL29jZnMyL2xvY2tzLmgKQEAgLTI3LDUgKzI3LDYgQEAKICNkZWZpbmUgT0NGUzJfTE9DS1NfSAogCiBpbnQgb2NmczJfZmxvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKK2ludCBvY2ZzMl9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CiAKICNlbmRpZiAvKiBPQ0ZTMl9MT0NLU19IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCBkNWQ4MDhmLi40ODVhNmFhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5jCisrKyBiL2ZzL29jZnMyL25hbWVpLmMKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlICJzeW1saW5rLmgiCiAjaW5jbHVkZSAic3lzZmlsZS5oIgogI2luY2x1ZGUgInVwdG9kYXRlLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKQEAgLTMyNywxNCArMzI4LDkgQEAKIAlpZiAoc3RhdHVzID09IC1FTk9TUEMpCiAJCW1sb2coMCwgIkRpc2sgaXMgZnVsbFxuIik7CiAKLQlpZiAobmV3X2ZlX2JoKQotCQlicmVsc2UobmV3X2ZlX2JoKTsKLQotCWlmIChkZV9iaCkKLQkJYnJlbHNlKGRlX2JoKTsKLQotCWlmIChwYXJlbnRfZmVfYmgpCi0JCWJyZWxzZShwYXJlbnRfZmVfYmgpOworCWJyZWxzZShuZXdfZmVfYmgpOworCWJyZWxzZShkZV9iaCk7CisJYnJlbHNlKHBhcmVudF9mZV9iaCk7CiAKIAlpZiAoKHN0YXR1cyA8IDApICYmIGlub2RlKQogCQlpcHV0KGlub2RlKTsKQEAgLTY0NywxMiArNjQzLDkgQEAKIG91dDoKIAlvY2ZzMl9pbm9kZV91bmxvY2soZGlyLCAxKTsKIAotCWlmIChkZV9iaCkKLQkJYnJlbHNlKGRlX2JoKTsKLQlpZiAoZmVfYmgpCi0JCWJyZWxzZShmZV9iaCk7Ci0JaWYgKHBhcmVudF9mZV9iaCkKLQkJYnJlbHNlKHBhcmVudF9mZV9iaCk7CisJYnJlbHNlKGRlX2JoKTsKKwlicmVsc2UoZmVfYmgpOworCWJyZWxzZShwYXJlbnRfZmVfYmgpOwogCiAJbWxvZ19leGl0KGVycik7CiAKQEAgLTg1MSwxNyArODQ0LDEwIEBACiAJCWlwdXQob3JwaGFuX2Rpcik7CiAJfQogCi0JaWYgKGZlX2JoKQotCQlicmVsc2UoZmVfYmgpOwotCi0JaWYgKGRpcmVudF9iaCkKLQkJYnJlbHNlKGRpcmVudF9iaCk7Ci0KLQlpZiAocGFyZW50X25vZGVfYmgpCi0JCWJyZWxzZShwYXJlbnRfbm9kZV9iaCk7Ci0KLQlpZiAob3JwaGFuX2VudHJ5X2JoKQotCQlicmVsc2Uob3JwaGFuX2VudHJ5X2JoKTsKKwlicmVsc2UoZmVfYmgpOworCWJyZWxzZShkaXJlbnRfYmgpOworCWJyZWxzZShwYXJlbnRfbm9kZV9iaCk7CisJYnJlbHNlKG9ycGhhbl9lbnRyeV9iaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIApAQCAtMTM3MiwyNCArMTM1OCwxNSBAQAogCiAJaWYgKG5ld19pbm9kZSkKIAkJaXB1dChuZXdfaW5vZGUpOwotCWlmIChuZXdmZV9iaCkKLQkJYnJlbHNlKG5ld2ZlX2JoKTsKLQlpZiAob2xkX2lub2RlX2JoKQotCQlicmVsc2Uob2xkX2lub2RlX2JoKTsKLQlpZiAob2xkX2Rpcl9iaCkKLQkJYnJlbHNlKG9sZF9kaXJfYmgpOwotCWlmIChuZXdfZGlyX2JoKQotCQlicmVsc2UobmV3X2Rpcl9iaCk7Ci0JaWYgKG5ld19kZV9iaCkKLQkJYnJlbHNlKG5ld19kZV9iaCk7Ci0JaWYgKG9sZF9kZV9iaCkKLQkJYnJlbHNlKG9sZF9kZV9iaCk7Ci0JaWYgKG9sZF9pbm9kZV9kZV9iaCkKLQkJYnJlbHNlKG9sZF9pbm9kZV9kZV9iaCk7Ci0JaWYgKG9ycGhhbl9lbnRyeV9iaCkKLQkJYnJlbHNlKG9ycGhhbl9lbnRyeV9iaCk7Ci0JaWYgKGluc2VydF9lbnRyeV9iaCkKLQkJYnJlbHNlKGluc2VydF9lbnRyeV9iaCk7CisJYnJlbHNlKG5ld2ZlX2JoKTsKKwlicmVsc2Uob2xkX2lub2RlX2JoKTsKKwlicmVsc2Uob2xkX2Rpcl9iaCk7CisJYnJlbHNlKG5ld19kaXJfYmgpOworCWJyZWxzZShuZXdfZGVfYmgpOworCWJyZWxzZShvbGRfZGVfYmgpOworCWJyZWxzZShvbGRfaW5vZGVfZGVfYmgpOworCWJyZWxzZShvcnBoYW5fZW50cnlfYmgpOworCWJyZWxzZShpbnNlcnRfZW50cnlfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAKQEAgLTE0OTIsOCArMTQ2OSw3IEBACiAKIAlpZiAoYmhzKSB7CiAJCWZvcihpID0gMDsgaSA8IGJsb2NrczsgaSsrKQotCQkJaWYgKGJoc1tpXSkKLQkJCQlicmVsc2UoYmhzW2ldKTsKKwkJCWJyZWxzZShiaHNbaV0pOwogCQlrZnJlZShiaHMpOwogCX0KIApAQCAtMTU5OCwxMCArMTU3NCwxMCBAQAogCQl1MzIgb2Zmc2V0ID0gMDsKIAogCQlpbm9kZS0+aV9vcCA9ICZvY2ZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsIDAsCi0JCQkJCQkgICAgbmV3X2ZlX2JoLAotCQkJCQkJICAgIGhhbmRsZSwgZGF0YV9hYywgTlVMTCwKLQkJCQkJCSAgICBOVUxMKTsKKwkJc3RhdHVzID0gb2NmczJfYWRkX2lub2RlX2RhdGEob3NiLCBpbm9kZSwgJm9mZnNldCwgMSwgMCwKKwkJCQkJICAgICAgbmV3X2ZlX2JoLAorCQkJCQkgICAgICBoYW5kbGUsIGRhdGFfYWMsIE5VTEwsCisJCQkJCSAgICAgIE5VTEwpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDICYmIHN0YXR1cyAhPSAtRUlOVFIpIHsKIAkJCQltbG9nKE1MX0VSUk9SLApAQCAtMTY1OSwxMiArMTYzNSw5IEBACiAKIAlvY2ZzMl9pbm9kZV91bmxvY2soZGlyLCAxKTsKIAotCWlmIChuZXdfZmVfYmgpCi0JCWJyZWxzZShuZXdfZmVfYmgpOwotCWlmIChwYXJlbnRfZmVfYmgpCi0JCWJyZWxzZShwYXJlbnRfZmVfYmgpOwotCWlmIChkZV9iaCkKLQkJYnJlbHNlKGRlX2JoKTsKKwlicmVsc2UobmV3X2ZlX2JoKTsKKwlicmVsc2UocGFyZW50X2ZlX2JoKTsKKwlicmVsc2UoZGVfYmgpOwogCWlmIChpbm9kZV9hYykKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGlub2RlX2FjKTsKIAlpZiAoZGF0YV9hYykKQEAgLTE3NTksOCArMTczMiw3IEBACiAJCWlwdXQob3JwaGFuX2Rpcl9pbm9kZSk7CiAJfQogCi0JaWYgKG9ycGhhbl9kaXJfYmgpCi0JCWJyZWxzZShvcnBoYW5fZGlyX2JoKTsKKwlicmVsc2Uob3JwaGFuX2Rpcl9iaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTc4MCwxMCArMTc1Miw5IEBACiAKIAltbG9nX2VudHJ5KCIoaW5vZGUtPmlfaW5vID0gJWx1KVxuIiwgaW5vZGUtPmlfaW5vKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLAorCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3JwaGFuX2Rpcl9pbm9kZSwKIAkJCQkgIE9DRlMyX0kob3JwaGFuX2Rpcl9pbm9kZSktPmlwX2Jsa25vLAotCQkJCSAgJm9ycGhhbl9kaXJfYmgsIE9DRlMyX0JIX0NBQ0hFRCwKLQkJCQkgIG9ycGhhbl9kaXJfaW5vZGUpOworCQkJCSAgJm9ycGhhbl9kaXJfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKQEAgLTE4MjksOCArMTgwMCw3IEBACiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgb3NiLT5zbG90X251bSk7CiAKIGxlYXZlOgotCWlmIChvcnBoYW5fZGlyX2JoKQotCQlicmVsc2Uob3JwaGFuX2Rpcl9iaCk7CisJYnJlbHNlKG9ycGhhbl9kaXJfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE4OTgsOCArMTg2OCw3IEBACiAJfQogCiBsZWF2ZToKLQlpZiAodGFyZ2V0X2RlX2JoKQotCQlicmVsc2UodGFyZ2V0X2RlX2JoKTsKKwlicmVsc2UodGFyZ2V0X2RlX2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xOTE4LDQgKzE4ODcsOCBAQAogCS5zZXRhdHRyCT0gb2NmczJfc2V0YXR0ciwKIAkuZ2V0YXR0cgk9IG9jZnMyX2dldGF0dHIsCiAJLnBlcm1pc3Npb24JPSBvY2ZzMl9wZXJtaXNzaW9uLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gb2NmczJfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczIuaCBiL2ZzL29jZnMyL29jZnMyLmgKaW5kZXggN2Y2MjVmMi4uYTIxYTQ2NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczIuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMi5oCkBAIC0zNCw3ICszNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2lmbmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAorIyBpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyMgaW5jbHVkZSAib2NmczJfamJkX2NvbXBhdC5oIgorI2VuZGlmCiAKIC8qIEZvciB1bmlvbiBvY2ZzMl9kbG1fbGtzYiAqLwogI2luY2x1ZGUgInN0YWNrZ2x1ZS5oIgpAQCAtMTcxLDkgKzE3NiwxMyBAQAogCiBlbnVtIG9jZnMyX2xvY2FsX2FsbG9jX3N0YXRlCiB7Ci0JT0NGUzJfTEFfVU5VU0VEID0gMCwKLQlPQ0ZTMl9MQV9FTkFCTEVELAotCU9DRlMyX0xBX0RJU0FCTEVECisJT0NGUzJfTEFfVU5VU0VEID0gMCwJLyogTG9jYWwgYWxsb2Mgd2lsbCBuZXZlciBiZSB1c2VkIGZvcgorCQkJCSAqIHRoaXMgbW91bnRwb2ludC4gKi8KKwlPQ0ZTMl9MQV9FTkFCTEVELAkvKiBMb2NhbCBhbGxvYyBpcyBpbiB1c2UuICovCisJT0NGUzJfTEFfVEhST1RUTEVELAkvKiBMb2NhbCBhbGxvYyBpcyBpbiB1c2UsIGJ1dCBudW1iZXIKKwkJCQkgKiBvZiBiaXRzIGhhcyBiZWVuIHJlZHVjZWQuICovCisJT0NGUzJfTEFfRElTQUJMRUQJLyogTG9jYWwgYWxsb2MgaGFzIHRlbXBvcmFyaWx5IGJlZW4KKwkJCQkgKiBkaXNhYmxlZC4gKi8KIH07CiAKIGVudW0gb2NmczJfbW91bnRfb3B0aW9ucwpAQCAtMTg0LDYgKzE5Myw4IEBACiAJT0NGUzJfTU9VTlRfRVJST1JTX1BBTklDID0gMSA8PCAzLCAvKiBQYW5pYyBvbiBlcnJvcnMgKi8KIAlPQ0ZTMl9NT1VOVF9EQVRBX1dSSVRFQkFDSyA9IDEgPDwgNCwgLyogTm8gZGF0YSBvcmRlcmluZyAqLwogCU9DRlMyX01PVU5UX0xPQ0FMRkxPQ0tTID0gMSA8PCA1LCAvKiBObyBjbHVzdGVyIGF3YXJlIHVzZXIgZmlsZSBsb2NrcyAqLworCU9DRlMyX01PVU5UX05PVVNFUlhBVFRSID0gMSA8PCA2LCAvKiBObyB1c2VyIHhhdHRyICovCisJT0NGUzJfTU9VTlRfSU5PREU2NCA9IDEgPDwgNywJLyogQWxsb3cgaW5vZGUgbnVtYmVycyA+IDJeMzIgKi8KIH07CiAKICNkZWZpbmUgT0NGUzJfT1NCX1NPRlRfUk8JMHgwMDAxCkBAIC0yMTQsNiArMjI1LDcgQEAKIAl1MzIgYml0bWFwX2NwZzsKIAl1OCAqdXVpZDsKIAljaGFyICp1dWlkX3N0cjsKKwl1MzIgdXVpZF9oYXNoOwogCXU4ICp2b2xfbGFiZWw7CiAJdTY0IGZpcnN0X2NsdXN0ZXJfZ3JvdXBfYmxrbm87CiAJdTMyIGZzX2dlbmVyYXRpb247CkBAIC0yNDEsNiArMjUzLDcgQEAKIAlpbnQgc19zZWN0c2l6ZV9iaXRzOwogCWludCBzX2NsdXN0ZXJzaXplOwogCWludCBzX2NsdXN0ZXJzaXplX2JpdHM7CisJdW5zaWduZWQgaW50IHNfeGF0dHJfaW5saW5lX3NpemU7CiAKIAlhdG9taWNfdCB2b2xfc3RhdGU7CiAJc3RydWN0IG11dGV4IHJlY292ZXJ5X2xvY2s7CkBAIC0yNTIsMTEgKzI2NSwyNyBAQAogCXN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsOwogCXVuc2lnbmVkIGxvbmcgb3NiX2NvbW1pdF9pbnRlcnZhbDsKIAotCWludCBsb2NhbF9hbGxvY19zaXplOwotCWVudW0gb2NmczJfbG9jYWxfYWxsb2Nfc3RhdGUgbG9jYWxfYWxsb2Nfc3RhdGU7CisJc3RydWN0IGRlbGF5ZWRfd29yawkJbGFfZW5hYmxlX3dxOworCisJLyoKKwkgKiBNdXN0IGhvbGQgbG9jYWwgYWxsb2MgaV9tdXRleCBhbmQgb3NiLT5vc2JfbG9jayB0byBjaGFuZ2UKKwkgKiBsb2NhbF9hbGxvY19iaXRzLiBSZWFkcyBjYW4gYmUgZG9uZSB1bmRlciBlaXRoZXIgbG9jay4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbG9jYWxfYWxsb2NfYml0czsKKwl1bnNpZ25lZCBpbnQgbG9jYWxfYWxsb2NfZGVmYXVsdF9iaXRzOworCisJZW51bSBvY2ZzMl9sb2NhbF9hbGxvY19zdGF0ZSBsb2NhbF9hbGxvY19zdGF0ZTsgLyogcHJvdGVjdGVkCisJCQkJCQkJICogYnkgb3NiX2xvY2sgKi8KKwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbG9jYWxfYWxsb2NfYmg7CisKIAl1NjQgbGFfbGFzdF9nZDsKIAorI2lmZGVmIENPTkZJR19PQ0ZTMl9GU19TVEFUUworCXN0cnVjdCBkZW50cnkgKmxvY2FsX2FsbG9jX2RlYnVnOworCWNoYXIgKmxvY2FsX2FsbG9jX2RlYnVnX2J1ZjsKKyNlbmRpZgorCiAJLyogTmV4dCB0d28gZmllbGRzIGFyZSBmb3IgbG9jYWwgbm9kZSBzbG90IHJlY292ZXJ5IGR1cmluZwogCSAqIG1vdW50LiAqLwogCWludCBkaXJ0eTsKQEAgLTM0MCw2ICszNjksMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfc3VwcG9ydHNfeGF0dHIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJaWYgKG9zYi0+c19mZWF0dXJlX2luY29tcGF0ICYgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9YQVRUUikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIC8qIHNldCAvIGNsZWFyIGZ1bmN0aW9ucyBiZWNhdXNlIGNsdXN0ZXIgZXZlbnRzIGNhbiBtYWtlIHRoZXNlIGhhcHBlbgogICogaW4gcGFyYWxsZWwgc28gd2Ugd2FudCB0aGUgdHJhbnNpdGlvbnMgdG8gYmUgYXRvbWljLiB0aGlzIGFsc28KICAqIG1lYW5zIHRoYXQgYW55IGZ1dHVyZSBmbGFncyBvc2JfZmxhZ3MgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgc3BpbmxvY2sKQEAgLTU1NCw2ICs1OTAsMTQgQEAKIAlyZXR1cm4gcGFnZXNfcGVyX2NsdXN0ZXI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9jZnMyX21lZ2FieXRlc190b19jbHVzdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBtZWdzKQoreworCUJVSUxEX0JVR19PTihPQ0ZTMl9NQVhfQ0xVU1RFUlNJWkUgPiAxMDQ4NTc2KTsKKworCXJldHVybiBtZWdzIDw8ICgyMCAtIE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIG9jZnMyX2luaXRfaW5vZGVfc3RlYWxfc2xvdChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKIHsKIAlzcGluX2xvY2soJm9zYi0+b3NiX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczJfZnMuaCBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKaW5kZXggNGY2MTk4NS4uZjI0Y2UzZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczJfZnMuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMl9mcy5oCkBAIC02NCw2ICs2NCw3IEBACiAjZGVmaW5lIE9DRlMyX0lOT0RFX1NJR05BVFVSRQkJIklOT0RFMDEiCiAjZGVmaW5lIE9DRlMyX0VYVEVOVF9CTE9DS19TSUdOQVRVUkUJIkVYQkxLMDEiCiAjZGVmaW5lIE9DRlMyX0dST1VQX0RFU0NfU0lHTkFUVVJFICAgICAgIkdST1VQMDEiCisjZGVmaW5lIE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRQkiWEFUVFIwMSIKIAogLyogQ29tcGF0aWJpbGl0eSBmbGFncyAqLwogI2RlZmluZSBPQ0ZTMl9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCkBAIC05MCw3ICs5MSw4IEBACiAJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfU1BBUlNFX0FMTE9DIFwKIAkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9JTkxJTkVfREFUQSBcCiAJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5ERURfU0xPVF9NQVAgXAotCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1VTRVJTUEFDRV9TVEFDSykKKwkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9VU0VSU1BBQ0VfU1RBQ0sgXAorCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1hBVFRSKQogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCU9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOV1JJVFRFTgogCiAvKgpAQCAtMTI3LDEwICsxMjksNiBAQAogLyogU3VwcG9ydCBmb3IgZGF0YSBwYWNrZWQgaW50byBpbm9kZSBibG9ja3MgKi8KICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9JTkxJTkVfREFUQQkweDAwNDAKIAotLyogU3VwcG9ydCBmb3IgdGhlIGV4dGVuZGVkIHNsb3QgbWFwICovCi0jZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5ERURfU0xPVF9NQVAgMHgxMDAKLQotCiAvKgogICogU3VwcG9ydCBmb3IgYWx0ZXJuYXRlLCB1c2Vyc3BhY2UgY2x1c3RlciBzdGFja3MuICBJZiBzZXQsIHRoZSBzdXBlcmJsb2NrCiAgKiBmaWVsZCBzX2NsdXN0ZXJfaW5mbyBjb250YWlucyBhIHRhZyBmb3IgdGhlIGFsdGVybmF0ZSBzdGFjayBpbiB1c2UgYXMKQEAgLTE0Miw2ICsxNDAsMTIgQEAKICAqLwogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1VTRVJTUEFDRV9TVEFDSwkweDAwODAKIAorLyogU3VwcG9ydCBmb3IgdGhlIGV4dGVuZGVkIHNsb3QgbWFwICovCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5ERURfU0xPVF9NQVAgMHgxMDAKKworLyogU3VwcG9ydCBmb3IgZXh0ZW5kZWQgYXR0cmlidXRlcyAqLworI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1hBVFRSCQkweDAyMDAKKwogLyoKICAqIGJhY2t1cCBzdXBlcmJsb2NrIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgdm9sdW1lCiAgKiBoYXMgYmFja3VwIHN1cGVyYmxvY2tzLgpAQCAtMjk5LDYgKzMwMywxMiBAQAogICovCiAjZGVmaW5lIE9DRlMyX0RFRkFVTFRfTE9DQUxfQUxMT0NfU0laRQk4CiAKKy8qCisgKiBJbmxpbmUgZXh0ZW5kZWQgYXR0cmlidXRlIHNpemUgKGluIGJ5dGVzKQorICogVGhlIHZhbHVlIGNob3NlbiBzaG91bGQgYmUgYWxpZ25lZCB0byAxNiBieXRlIGJvdW5kYXJpZXMuCisgKi8KKyNkZWZpbmUgT0NGUzJfTUlOX1hBVFRSX0lOTElORV9TSVpFICAgICAyNTYKKwogc3RydWN0IG9jZnMyX3N5c3RlbV9pbm9kZV9pbmZvIHsKIAljaGFyCSpzaV9uYW1lOwogCWludAlzaV9pZmxhZ3M7CkBAIC01NjMsNyArNTczLDcgQEAKIC8qNDAqLwlfX2xlMTYgc19tYXhfc2xvdHM7CQkvKiBNYXggbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBtb3VudHMKIAkJCQkJICAgYmVmb3JlIHR1bmVmcyByZXF1aXJlZCAqLwogCV9fbGUxNiBzX3R1bmVmc19mbGFnOwotCV9fbGUzMiBzX3Jlc2VydmVkMTsKKwlfX2xlMzIgc191dWlkX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIHV1aWQgKi8KIAlfX2xlNjQgc19maXJzdF9jbHVzdGVyX2dyb3VwOwkvKiBCbG9jayBvZmZzZXQgb2YgMXN0IGNsdXN0ZXIKIAkJCQkJICogZ3JvdXAgaGVhZGVyICovCiAvKjUwKi8JX191OCAgc19sYWJlbFtPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTl07CS8qIExhYmVsIGZvciBtb3VudGluZywgZXRjLiAqLwpAQCAtNTcxLDcgKzU4MSwxMSBAQAogLypBMCovICBzdHJ1Y3Qgb2NmczJfY2x1c3Rlcl9pbmZvIHNfY2x1c3Rlcl9pbmZvOyAvKiBTZWxlY3RlZCB1c2Vyc3BhY2UKIAkJCQkJCSAgICAgc3RhY2suICBPbmx5IHZhbGlkCiAJCQkJCQkgICAgIHdpdGggSU5DT01QQVQgZmxhZy4gKi8KLS8qQjgqLyAgX19sZTY0IHNfcmVzZXJ2ZWQyWzE3XTsJCS8qIEZpbGwgb3V0IHN1cGVyYmxvY2sgKi8KKy8qQjgqLwlfX2xlMTYgc194YXR0cl9pbmxpbmVfc2l6ZTsJLyogZXh0ZW5kZWQgYXR0cmlidXRlIGlubGluZSBzaXplCisJCQkJCSAgIGZvciB0aGlzIGZzKi8KKwlfX2xlMTYgc19yZXNlcnZlZDA7CisJX19sZTMyIHNfcmVzZXJ2ZWQxOworLypDMCovICBfX2xlNjQgc19yZXNlcnZlZDJbMTZdOwkJLyogRmlsbCBvdXQgc3VwZXJibG9jayAqLwogLyoxNDAqLwogCiAJLyoKQEAgLTYyMSw3ICs2MzUsOCBAQAogCQkJCQkgICBiZWxvbmdzIHRvICovCiAJX19sZTE2IGlfc3ViYWxsb2NfYml0OwkJLyogQml0IG9mZnNldCBpbiBzdWJhbGxvY2F0b3IKIAkJCQkJICAgYmxvY2sgZ3JvdXAgKi8KLS8qMTAqLwlfX2xlMzIgaV9yZXNlcnZlZDA7CisvKjEwKi8JX19sZTE2IGlfcmVzZXJ2ZWQwOworCV9fbGUxNiBpX3hhdHRyX2lubGluZV9zaXplOwogCV9fbGUzMiBpX2NsdXN0ZXJzOwkJLyogQ2x1c3RlciBjb3VudCAqLwogCV9fbGUzMiBpX3VpZDsJCQkvKiBPd25lciBVSUQgKi8KIAlfX2xlMzIgaV9naWQ7CQkJLyogT3duaW5nIEdJRCAqLwpAQCAtNjQwLDExICs2NTUsMTIgQEAKIAlfX2xlMzIgaV9hdGltZV9uc2VjOwogCV9fbGUzMiBpX2N0aW1lX25zZWM7CiAJX19sZTMyIGlfbXRpbWVfbnNlYzsKLQlfX2xlMzIgaV9hdHRyOworLyo3MCovCV9fbGUzMiBpX2F0dHI7CiAJX19sZTE2IGlfb3JwaGFuZWRfc2xvdDsJCS8qIE9ubHkgdmFsaWQgd2hlbiBPQ0ZTMl9PUlBIQU5FRF9GTAogCQkJCQkgICB3YXMgc2V0IGluIGlfZmxhZ3MgKi8KIAlfX2xlMTYgaV9keW5fZmVhdHVyZXM7Ci0vKjcwKi8JX19sZTY0IGlfcmVzZXJ2ZWQyWzhdOworCV9fbGU2NCBpX3hhdHRyX2xvYzsKKy8qODAqLwlfX2xlNjQgaV9yZXNlcnZlZDJbN107CiAvKkI4Ki8JdW5pb24gewogCQlfX2xlNjQgaV9wYWQxOwkJLyogR2VuZXJpYyB3YXkgdG8gcmVmZXIgdG8gdGhpcwogCQkJCQkgICA2NGJpdCB1bmlvbiAqLwpAQCAtNzE1LDYgKzczMSwxMzYgQEAKIC8qNDAqLwlfX3U4ICAgIGJnX2JpdG1hcFswXTsKIH07CiAKKy8qCisgKiBPbiBkaXNrIGV4dGVuZGVkIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgZm9yIE9DRlMyLgorICovCisKKy8qCisgKiBvY2ZzMl94YXR0cl9lbnRyeSBpbmRpY2F0ZXMgb25lIGV4dGVuZCBhdHRyaWJ1dGUuCisgKgorICogTm90ZSB0aGF0IGl0IGNhbiBiZSBzdG9yZWQgaW4gaW5vZGUsIG9uZSBibG9jayBvciBvbmUgeGF0dHIgYnVja2V0LgorICovCitzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgeworCV9fbGUzMgl4ZV9uYW1lX2hhc2g7ICAgIC8qIGhhc2ggdmFsdWUgb2YgeGF0dHIgcHJlZml4K3N1ZmZpeC4gKi8KKwlfX2xlMTYJeGVfbmFtZV9vZmZzZXQ7ICAvKiBieXRlIG9mZnNldCBmcm9tIHRoZSAxc3QgZXRucnkgaW4gdGhlIGxvY2FsCisJCQkJICAgIGxvY2FsIHhhdHRyIHN0b3JhZ2UoaW5vZGUsIHhhdHRyIGJsb2NrIG9yCisJCQkJICAgIHhhdHRyIGJ1Y2tldCkuICovCisJX191OAl4ZV9uYW1lX2xlbjsJIC8qIHhhdHRyIG5hbWUgbGVuLCBkb2VzJ3QgaW5jbHVkZSBwcmVmaXguICovCisJX191OAl4ZV90eXBlOyAgICAgICAgIC8qIHRoZSBsb3cgNyBiaXRzIGluZGljYXRlcyB0aGUgbmFtZSBwcmVmaXgncworCQkJCSAgKiB0eXBlIGFuZCB0aGUgaGlnaGVzdCAxIGJpdHMgaW5kaWNhdGUgd2hldGhlcgorCQkJCSAgKiB0aGUgRUEgaXMgc3RvcmVkIGluIHRoZSBsb2NhbCBzdG9yYWdlLiAqLworCV9fbGU2NAl4ZV92YWx1ZV9zaXplOwkgLyogcmVhbCB4YXR0ciB2YWx1ZSBsZW5ndGguICovCit9OworCisvKgorICogT24gZGlzayBzdHJ1Y3R1cmUgZm9yIHhhdHRyIGhlYWRlci4KKyAqCisgKiBPbmUgb2NmczJfeGF0dHJfaGVhZGVyIGRlc2NyaWJlcyBob3cgbWFueSBvY2ZzMl94YXR0cl9lbnRyeSByZWNvcmRzIGluCisgKiB0aGUgbG9jYWwgeGF0dHIgc3RvcmFnZS4KKyAqLworc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciB7CisJX19sZTE2CXhoX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGFpbnMgdGhlIGNvdW50IG9mIGhvdworCQkJCQkJICAgbWFueSByZWNvcmRzIGFyZSBpbiB0aGUKKwkJCQkJCSAgIGxvY2FsIHhhdHRyIHN0b3JhZ2UuICovCisJX19sZTE2CXhoX2ZyZWVfc3RhcnQ7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBvZmZzZXQgZm9yIHN0b3JpbmcKKwkJCQkJCSAgIHhhdHRyLiAqLworCV9fbGUxNgl4aF9uYW1lX3ZhbHVlX2xlbjsgICAgICAgICAgICAgIC8qIHRvdGFsIGxlbmd0aCBvZiBuYW1lL3ZhbHVlCisJCQkJCQkgICBsZW5ndGggaW4gdGhpcyBidWNrZXQuICovCisJX19sZTE2CXhoX251bV9idWNrZXRzOyAgICAgICAgICAgICAgICAgLyogYnVja2V0IG51bXMgaW4gb25lIGV4dGVudAorCQkJCQkJICAgcmVjb3JkLCBvbmx5IHZhbGlkIGluIHRoZQorCQkJCQkJICAgZmlyc3QgYnVja2V0LiAqLworCV9fbGU2NCAgeGhfY3N1bTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgeGhfZW50cmllc1swXTsgLyogeGF0dHIgZW50cnkgbGlzdC4gKi8KK307CisKKy8qCisgKiBPbiBkaXNrIHN0cnVjdHVyZSBmb3IgeGF0dHIgdmFsdWUgcm9vdC4KKyAqCisgKiBJdCBpcyB1c2VkIHdoZW4gb25lIGV4dGVuZGVkIGF0dHJpYnV0ZSdzIHNpemUgaXMgbGFyZ2VyLCBhbmQgd2Ugd2lsbCBzYXZlIGl0CisgKiBpbiBhbiBvdXRzaWRlIGNsdXN0ZXIuIEl0IHdpbGwgc3RvcmVkIGluIGEgYi10cmVlIGxpa2UgZmlsZSBjb250ZW50LgorICovCitzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCB7CisvKjAwKi8JX19sZTMyCXhyX2NsdXN0ZXJzOyAgICAgICAgICAgICAgLyogY2x1c3RlcnMgY292ZXJlZCBieSB4YXR0ciB2YWx1ZS4gKi8KKwlfX2xlMzIJeHJfcmVzZXJ2ZWQwOworCV9fbGU2NAl4cl9sYXN0X2ViX2JsazsgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbGFzdCBleHRlbnQgYmxvY2sgKi8KKy8qMTAqLwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgeHJfbGlzdDsgLyogRXh0ZW50IHJlY29yZCBsaXN0ICovCit9OworCisvKgorICogT24gZGlzayBzdHJ1Y3R1cmUgZm9yIHhhdHRyIHRyZWUgcm9vdC4KKyAqCisgKiBJdCBpcyB1c2VkIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIG9uZSBmaWxlLiBUaGVzZQorICogYXR0cmlidXRlcyB3aWxsIGJlIG9yZ2FuaXplZCBhbmQgc3RvcmVkIGluIGFuIGluZGV4ZWQtYnRyZWUuCisgKi8KK3N0cnVjdCBvY2ZzMl94YXR0cl90cmVlX3Jvb3QgeworLyowMCovCV9fbGUzMgl4dF9jbHVzdGVyczsgICAgICAgICAgICAgIC8qIGNsdXN0ZXJzIGNvdmVyZWQgYnkgeGF0dHIuICovCisJX19sZTMyCXh0X3Jlc2VydmVkMDsKKwlfX2xlNjQJeHRfbGFzdF9lYl9ibGs7ICAgICAgICAgICAvKiBQb2ludGVyIHRvIGxhc3QgZXh0ZW50IGJsb2NrICovCisvKjEwKi8Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0IHh0X2xpc3Q7IC8qIEV4dGVudCByZWNvcmQgbGlzdCAqLworfTsKKworI2RlZmluZSBPQ0ZTMl9YQVRUUl9JTkRFWEVECTB4MQorI2RlZmluZSBPQ0ZTMl9IQVNIX1NISUZUCTUKKyNkZWZpbmUgT0NGUzJfWEFUVFJfUk9VTkQJMworI2RlZmluZSBPQ0ZTMl9YQVRUUl9TSVpFKHNpemUpCSgoKHNpemUpICsgT0NGUzJfWEFUVFJfUk9VTkQpICYgXAorCQkJCX4oT0NGUzJfWEFUVFJfUk9VTkQpKQorCisjZGVmaW5lIE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFCQkJNDA5NgorI2RlZmluZSBPQ0ZTMl9YQVRUUl9NQVhfQkxPQ0tTX1BFUl9CVUNLRVQgCShPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSBcCisJCQkJCQkgLyBPQ0ZTMl9NSU5fQkxPQ0tTSVpFKQorCisvKgorICogT24gZGlzayBzdHJ1Y3R1cmUgZm9yIHhhdHRyIGJsb2NrLgorICovCitzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgeworLyowMCovCV9fdTgJeGJfc2lnbmF0dXJlWzhdOyAgICAgLyogU2lnbmF0dXJlIGZvciB2ZXJpZmljYXRpb24gKi8KKwlfX2xlMTYJeGJfc3ViYWxsb2Nfc2xvdDsgICAgLyogU2xvdCBzdWJhbGxvY2F0b3IgdGhpcworCQkJCQlibG9jayBiZWxvbmdzIHRvLiAqLworCV9fbGUxNgl4Yl9zdWJhbGxvY19iaXQ7ICAgICAvKiBCaXQgb2Zmc2V0IGluIHN1YmFsbG9jYXRvcgorCQkJCQlibG9jayBncm91cCAqLworCV9fbGUzMgl4Yl9mc19nZW5lcmF0aW9uOyAgICAvKiBNdXN0IG1hdGNoIHN1cGVyIGJsb2NrICovCisvKjEwKi8JX19sZTY0CXhiX2Jsa25vOyAgICAgICAgICAgIC8qIE9mZnNldCBvbiBkaXNrLCBpbiBibG9ja3MgKi8KKwlfX2xlNjQJeGJfY3N1bTsKKy8qMjAqLwlfX2xlMTYJeGJfZmxhZ3M7ICAgICAgICAgICAgLyogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBibG9jayBjb250YWlucworCQkJCQlyZWFsIHhhdHRyIG9yIGEgeGF0dHIgdHJlZS4gKi8KKwlfX2xlMTYJeGJfcmVzZXJ2ZWQwOworCV9fbGUzMiAgeGJfcmVzZXJ2ZWQxOworCV9fbGU2NAl4Yl9yZXNlcnZlZDI7CisvKjMwKi8JdW5pb24geworCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyIHhiX2hlYWRlcjsgLyogeGF0dHIgaGVhZGVyIGlmIHRoaXMKKwkJCQkJCQlibG9jayBjb250YWlucyB4YXR0ciAqLworCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290IHhiX3Jvb3Q7LyogeGF0dHIgdHJlZSByb290IGlmIHRoaXMKKwkJCQkJCQlibG9jayBjb3RhaW5zIHhhdHRyCisJCQkJCQkJdHJlZS4gKi8KKwl9IHhiX2F0dHJzOworfTsKKworI2RlZmluZSBPQ0ZTMl9YQVRUUl9FTlRSWV9MT0NBTAkJMHg4MAorI2RlZmluZSBPQ0ZTMl9YQVRUUl9UWVBFX01BU0sJCTB4N0YKK3N0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl94YXR0cl9zZXRfbG9jYWwoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSwKKwkJCQkJIGludCBsb2NhbCkKK3sKKwlpZiAobG9jYWwpCisJCXhlLT54ZV90eXBlIHw9IE9DRlMyX1hBVFRSX0VOVFJZX0xPQ0FMOworCWVsc2UKKwkJeGUtPnhlX3R5cGUgJj0gfk9DRlMyX1hBVFRSX0VOVFJZX0xPQ0FMOworfQorCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl94YXR0cl9pc19sb2NhbChzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlKQoreworCXJldHVybiB4ZS0+eGVfdHlwZSAmIE9DRlMyX1hBVFRSX0VOVFJZX0xPQ0FMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfeGF0dHJfc2V0X3R5cGUoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSwgaW50IHR5cGUpCit7CisJeGUtPnhlX3R5cGUgfD0gdHlwZSAmIE9DRlMyX1hBVFRSX1RZUEVfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfeGF0dHJfZ2V0X3R5cGUoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSkKK3sKKwlyZXR1cm4geGUtPnhlX3R5cGUgJiBPQ0ZTMl9YQVRUUl9UWVBFX01BU0s7Cit9CisKICNpZmRlZiBfX0tFUk5FTF9fCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9mYXN0X3N5bWxpbmtfY2hhcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKQEAgLTcyOCw2ICs4NzQsMjAgQEAKIAkJb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyLmlfZGF0YS5pZF9kYXRhKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfbWF4X2lubGluZV9kYXRhX3dpdGhfeGF0dHIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCSAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpKQoreworCXVuc2lnbmVkIGludCB4YXR0cnNpemUgPSBsZTE2X3RvX2NwdShkaS0+aV94YXR0cl9pbmxpbmVfc2l6ZSk7CisKKwlpZiAobGUxNl90b19jcHUoZGktPmlfZHluX2ZlYXR1cmVzKSAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkKKwkJcmV0dXJuIHNiLT5zX2Jsb2Nrc2l6ZSAtCisJCQlvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfZGlub2RlLCBpZDIuaV9kYXRhLmlkX2RhdGEpIC0KKwkJCXhhdHRyc2l6ZTsKKwllbHNlCisJCXJldHVybiBzYi0+c19ibG9ja3NpemUgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyLmlfZGF0YS5pZF9kYXRhKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfZXh0ZW50X3JlY3NfcGVyX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJaW50IHNpemU7CkBAIC03MzgsNiArODk4LDI0IEBACiAJcmV0dXJuIHNpemUgLyBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9leHRlbnRfcmVjc19wZXJfaW5vZGVfd2l0aF94YXR0cigKKwkJCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSkKK3sKKwlpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgeGF0dHJzaXplID0gbGUxNl90b19jcHUoZGktPmlfeGF0dHJfaW5saW5lX3NpemUpOworCisJaWYgKGxlMTZfdG9fY3B1KGRpLT5pX2R5bl9mZWF0dXJlcykgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpCisJCXNpemUgPSBzYi0+c19ibG9ja3NpemUgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyLmlfbGlzdC5sX3JlY3MpIC0KKwkJCXhhdHRyc2l6ZTsKKwllbHNlCisJCXNpemUgPSBzYi0+c19ibG9ja3NpemUgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyLmlfbGlzdC5sX3JlY3MpOworCisJcmV0dXJuIHNpemUgLyBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9jaGFpbl9yZWNzX3Blcl9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWludCBzaXplOwpAQCAtODAxLDYgKzk3OSwxNyBAQAogCXJldHVybiAwOwogCiB9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG9jZnMyX3hhdHRyX3JlY3NfcGVyX3hiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IHNpemU7CisKKwlzaXplID0gc2ItPnNfYmxvY2tzaXplIC0KKwkJb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrLAorCQkJIHhiX2F0dHJzLnhiX3Jvb3QueHRfbGlzdC5sX3JlY3MpOworCisJcmV0dXJuIHNpemUgLyBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpOworfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Zhc3Rfc3ltbGlua19jaGFycyhpbnQgYmxvY2tzaXplKQogewpAQCAtODg0LDYgKzEwNzMsMTcgQEAKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl94YXR0cl9yZWNzX3Blcl94YihpbnQgYmxvY2tzaXplKQoreworCWludCBzaXplOworCisJc2l6ZSA9IGJsb2Nrc2l6ZSAtCisJCW9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywKKwkJCSB4Yl9hdHRycy54Yl9yb290Lnh0X2xpc3QubF9yZWNzKTsKKworCXJldHVybiBzaXplIC8gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKTsKK30KICNlbmRpZiAgLyogX19LRVJORUxfXyAqLwogCiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyX2piZF9jb21wYXQuaCBiL2ZzL29jZnMyL29jZnMyX2piZF9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFjNzhmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIvb2NmczJfamJkX2NvbXBhdC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCisgKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKKyAqCisgKiBvY2ZzMl9qYmRfY29tcGF0LmgKKyAqCisgKiBDb21wYXRpYmlsaXR5IGRlZmluZXMgZm9yIEpCRC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBPQ0ZTMl9KQkRfQ09NUEFUX0gKKyNkZWZpbmUgT0NGUzJfSkJEX0NPTVBBVF9ICisKKyNpZm5kZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKKyMgZXJyb3IgU2hvdWxkIG5vdCBoYXZlIGJlZW4gaW5jbHVkZWQKKyNlbmRpZgorCitzdHJ1Y3QgamJkMl9pbm9kZSB7CisJdW5zaWduZWQgaW50IGR1bW15OworfTsKKworI2RlZmluZSBKQkQyX0JBUlJJRVIJCQlKRlNfQkFSUklFUgorI2RlZmluZSBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UJSkJEX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UKKworI2RlZmluZSBqYmQyX2pvdXJuYWxfYWNrX2VycgkJCWpvdXJuYWxfYWNrX2VycgorI2RlZmluZSBqYmQyX2pvdXJuYWxfY2xlYXJfZXJyCQkJam91cm5hbF9jbGVhcl9lcnIKKyNkZWZpbmUgamJkMl9qb3VybmFsX2Rlc3Ryb3kJCQlqb3VybmFsX2Rlc3Ryb3kKKyNkZWZpbmUgamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhCQlqb3VybmFsX2RpcnR5X21ldGFkYXRhCisjZGVmaW5lIGpiZDJfam91cm5hbF9lcnJubwkJCWpvdXJuYWxfZXJybm8KKyNkZWZpbmUgamJkMl9qb3VybmFsX2V4dGVuZAkJCWpvdXJuYWxfZXh0ZW5kCisjZGVmaW5lIGpiZDJfam91cm5hbF9mbHVzaAkJCWpvdXJuYWxfZmx1c2gKKyNkZWZpbmUgamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdAkJam91cm5hbF9mb3JjZV9jb21taXQKKyNkZWZpbmUgamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MJCWpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcworI2RlZmluZSBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzCQlqb3VybmFsX2dldF91bmRvX2FjY2VzcworI2RlZmluZSBqYmQyX2pvdXJuYWxfaW5pdF9pbm9kZQkJCWpvdXJuYWxfaW5pdF9pbm9kZQorI2RlZmluZSBqYmQyX2pvdXJuYWxfaW52YWxpZGF0ZXBhZ2UJCWpvdXJuYWxfaW52YWxpZGF0ZXBhZ2UKKyNkZWZpbmUgamJkMl9qb3VybmFsX2xvYWQJCQlqb3VybmFsX2xvYWQKKyNkZWZpbmUgamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcwkJam91cm5hbF9sb2NrX3VwZGF0ZXMKKyNkZWZpbmUgamJkMl9qb3VybmFsX3Jlc3RhcnQJCQlqb3VybmFsX3Jlc3RhcnQKKyNkZWZpbmUgamJkMl9qb3VybmFsX3N0YXJ0CQkJam91cm5hbF9zdGFydAorI2RlZmluZSBqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0CQlqb3VybmFsX3N0YXJ0X2NvbW1pdAorI2RlZmluZSBqYmQyX2pvdXJuYWxfc3RvcAkJCWpvdXJuYWxfc3RvcAorI2RlZmluZSBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycwlqb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMKKyNkZWZpbmUgamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzCQlqb3VybmFsX3VubG9ja191cGRhdGVzCisjZGVmaW5lIGpiZDJfam91cm5hbF93aXBlCQkJam91cm5hbF93aXBlCisjZGVmaW5lIGpiZDJfbG9nX3dhaXRfY29tbWl0CQkJbG9nX3dhaXRfY29tbWl0CisKK3N0YXRpYyBpbmxpbmUgaW50IGpiZDJfam91cm5hbF9maWxlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgc3RydWN0IGpiZDJfaW5vZGUgKmlub2RlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBqYmQyX2pvdXJuYWxfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShzdHJ1Y3QgamJkMl9pbm9kZSAqaW5vZGUsCisJCQkJCQkgICAgICBsb2ZmX3QgbmV3X3NpemUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqYmQyX2pvdXJuYWxfaW5pdF9qYmRfaW5vZGUoc3RydWN0IGpiZDJfaW5vZGUgKmppbm9kZSwKKwkJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkMl9qb3VybmFsX3JlbGVhc2VfamJkX2lub2RlKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJCSAgc3RydWN0IGpiZDJfaW5vZGUgKmppbm9kZSkKK3sKKwlyZXR1cm47Cit9CisKKworI2VuZGlmICAvKiBPQ0ZTMl9KQkRfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3Jlc2l6ZS5jIGIvZnMvb2NmczIvcmVzaXplLmMKaW5kZXggODE2Njk2OC4uZmZkNDhkYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvcmVzaXplLmMKKysrIGIvZnMvb2NmczIvcmVzaXplLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCQlpZiAoY2x1c3RlciA+IGNsdXN0ZXJzKQogCQkJYnJlYWs7CiAKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGJsa25vLCAmYmFja3VwLCAwLCBOVUxMKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3Nfc3luYyhvc2IsIGJsa25vLCAxLCAmYmFja3VwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWJyZWFrOwpAQCAtMjM2LDggKzIzNiw4IEBACiAJICogdXBkYXRlIHRoZSBzdXBlcmJsb2NrIGxhc3QuCiAJICogSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHdyaXRlIGZhaWxlZC4KIAkgKi8KLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfU1VQRVJfQkxPQ0tfQkxLTk8sCi0JCQkgICAgICAgJnN1cGVyX2JoLCAwLCBOVUxMKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrc19zeW5jKG9zYiwgT0NGUzJfU1VQRVJfQkxPQ0tfQkxLTk8sIDEsCisJCQkJICAgICAmc3VwZXJfYmgpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zMzIsOCArMzMyLDcgQEAKIAlsZ2RfYmxrbm8gPSBvY2ZzMl93aGljaF9jbHVzdGVyX2dyb3VwKG1haW5fYm1faW5vZGUsCiAJCQkJCSAgICAgIGZpcnN0X25ld19jbHVzdGVyIC0gMSk7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgbGdkX2Jsa25vLCAmZ3JvdXBfYmgsIE9DRlMyX0JIX0NBQ0hFRCwKLQkJCSAgICAgICBtYWluX2JtX2lub2RlKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKG1haW5fYm1faW5vZGUsIGxnZF9ibGtubywgJmdyb3VwX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTU0MCw3ICs1MzksNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGlucHV0LT5ncm91cCwgJmdyb3VwX2JoLCAwLCBOVUxMKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrc19zeW5jKG9zYiwgaW5wdXQtPmdyb3VwLCAxLCAmZ3JvdXBfYmgpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2coTUxfRVJST1IsICJDYW4ndCByZWFkIHRoZSBncm91cCBkZXNjcmlwdG9yICMgJWxsdSAiCiAJCSAgICAgImZyb20gdGhlIGRldmljZS4iLCAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5ncm91cCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zbG90X21hcC5jIGIvZnMvb2NmczIvc2xvdF9tYXAuYwppbmRleCBiYjVmZjg5Li5iZGRhMmQ4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zbG90X21hcC5jCisrKyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKQEAgLTE1MCw4ICsxNTAsOCBAQAogCSAqIGJlICFOVUxMLiAgVGh1cywgb2NmczJfcmVhZF9ibG9ja3MoKSB3aWxsIGlnbm9yZSBibG9ja25yLiAgSWYKIAkgKiB0aGlzIGlzIG5vdCB0cnVlLCB0aGUgcmVhZCBvZiAtMSAoVUlOVDY0X01BWCkgd2lsbCBmYWlsLgogCSAqLwotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKG9zYiwgLTEsIHNpLT5zaV9ibG9ja3MsIHNpLT5zaV9iaCwgMCwKLQkJCQlzaS0+c2lfaW5vZGUpOworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKHNpLT5zaV9pbm9kZSwgLTEsIHNpLT5zaV9ibG9ja3MsIHNpLT5zaV9iaCwKKwkJCQlPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOwogCWlmIChyZXQgPT0gMCkgewogCQlzcGluX2xvY2soJm9zYi0+b3NiX2xvY2spOwogCQlvY2ZzMl91cGRhdGVfc2xvdF9pbmZvKHNpKTsKQEAgLTQwNCw3ICs0MDQsOCBAQAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOwogCiAJCWJoID0gTlVMTDsgIC8qIEFjcXVpcmUgYSBmcmVzaCBiaCAqLwotCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgYmxrbm8sICZiaCwgMCwgc2ktPnNpX2lub2RlKTsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3Moc2ktPnNpX2lub2RlLCBibGtubywgMSwgJmJoLAorCQkJCQkgICBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3RhY2tfdXNlci5jIGIvZnMvb2NmczIvc3RhY2tfdXNlci5jCmluZGV4IDM1M2ZjMzUuLmZhZWMyZDggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N0YWNrX3VzZXIuYworKysgYi9mcy9vY2ZzMi9zdGFja191c2VyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJvY2ZzMi5oIiAgLyogRm9yIHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqLwogI2luY2x1ZGUgInN0YWNrZ2x1ZS5oIgogCisjaW5jbHVkZSA8bGludXgvZGxtX3Bsb2NrLmg+CiAKIC8qCiAgKiBUaGUgY29udHJvbCBwcm90b2NvbCBzdGFydHMgd2l0aCBhIGhhbmRzaGFrZS4gIFVudGlsIHRoZSBoYW5kc2hha2UKQEAgLTc0Niw2ICs3NDcsMzcgQEAKIHsKIH0KIAorc3RhdGljIGludCB1c2VyX3Bsb2NrKHN0cnVjdCBvY2ZzMl9jbHVzdGVyX2Nvbm5lY3Rpb24gKmNvbm4sCisJCSAgICAgIHU2NCBpbm8sCisJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICBpbnQgY21kLAorCQkgICAgICBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwkvKgorCSAqIFRoaXMgbW9yZSBvciBsZXNzIGp1c3QgZGVtdXhlcyB0aGUgcGxvY2sgcmVxdWVzdCBpbnRvIGFueQorCSAqIG9uZSBvZiB0aHJlZSBkbG0gY2FsbHMuCisJICoKKwkgKiBJbnRlcm5hbGx5LCBmcy9kbG0gd2lsbCBwYXNzIHRoZXNlIHRvIGEgbWlzYyBkZXZpY2UsIHdoaWNoCisJICogYSB1c2Vyc3BhY2UgZGFlbW9uIHdpbGwgcmVhZCBhbmQgd3JpdGUgdG8uCisJICoKKwkgKiBGb3Igbm93LCBjYW5jZWwgcmVxdWVzdHMgKHdoaWNoIGhhcHBlbiBpbnRlcm5hbGx5IG9ubHkpLAorCSAqIGFyZSB0dXJuZWQgaW50byB1bmxvY2tzLiBNb3N0IG9mIHRoaXMgZnVuY3Rpb24gdGFrZW4gZnJvbQorCSAqIGdmczJfbG9jay4KKwkgKi8KKworCWlmIChjbWQgPT0gRl9DQU5DRUxMSykgeworCQljbWQgPSBGX1NFVExLOworCQlmbC0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJfQorCisJaWYgKElTX0dFVExLKGNtZCkpCisJCXJldHVybiBkbG1fcG9zaXhfZ2V0KGNvbm4tPmNjX2xvY2tzcGFjZSwgaW5vLCBmaWxlLCBmbCk7CisJZWxzZSBpZiAoZmwtPmZsX3R5cGUgPT0gRl9VTkxDSykKKwkJcmV0dXJuIGRsbV9wb3NpeF91bmxvY2soY29ubi0+Y2NfbG9ja3NwYWNlLCBpbm8sIGZpbGUsIGZsKTsKKwllbHNlCisJCXJldHVybiBkbG1fcG9zaXhfbG9jayhjb25uLT5jY19sb2Nrc3BhY2UsIGlubywgZmlsZSwgY21kLCBmbCk7Cit9CisKIC8qCiAgKiBDb21wYXJlIGEgcmVxdWVzdGVkIGxvY2tpbmcgcHJvdG9jb2wgdmVyc2lvbiBhZ2FpbnN0IHRoZSBjdXJyZW50IG9uZS4KICAqCkBAIC04MzksNiArODcxLDcgQEAKIAkuZGxtX3VubG9jawk9IHVzZXJfZGxtX3VubG9jaywKIAkubG9ja19zdGF0dXMJPSB1c2VyX2RsbV9sb2NrX3N0YXR1cywKIAkubG9ja19sdmIJPSB1c2VyX2RsbV9sdmIsCisJLnBsb2NrCQk9IHVzZXJfcGxvY2ssCiAJLmR1bXBfbGtzYgk9IHVzZXJfZGxtX2R1bXBfbGtzYiwKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jIGIvZnMvb2NmczIvc3RhY2tnbHVlLmMKaW5kZXggMDdmMzQ4Yi4uNjhiNjY4YiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3RhY2tnbHVlLmMKKysrIGIvZnMvb2NmczIvc3RhY2tnbHVlLmMKQEAgLTI4OCw2ICsyODgsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9jZnMyX2RsbV9kdW1wX2xrc2IpOwogCitpbnQgb2NmczJfc3RhY2tfc3VwcG9ydHNfcGxvY2tzKHZvaWQpCit7CisJcmV0dXJuIGFjdGl2ZV9zdGFjayAmJiBhY3RpdmVfc3RhY2stPnNwX29wcy0+cGxvY2s7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvY2ZzMl9zdGFja19zdXBwb3J0c19wbG9ja3MpOworCisvKgorICogb2NmczJfcGxvY2soKSBjYW4gb25seSBiZSBzYWZlbHkgY2FsbGVkIGlmCisgKiBvY2ZzMl9zdGFja19zdXBwb3J0c19wbG9ja3MoKSByZXR1cm5lZCB0cnVlCisgKi8KK2ludCBvY2ZzMl9wbG9jayhzdHJ1Y3Qgb2NmczJfY2x1c3Rlcl9jb25uZWN0aW9uICpjb25uLCB1NjQgaW5vLAorCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJV0FSTl9PTl9PTkNFKGFjdGl2ZV9zdGFjay0+c3Bfb3BzLT5wbG9jayA9PSBOVUxMKTsKKwlpZiAoYWN0aXZlX3N0YWNrLT5zcF9vcHMtPnBsb2NrKQorCQlyZXR1cm4gYWN0aXZlX3N0YWNrLT5zcF9vcHMtPnBsb2NrKGNvbm4sIGlubywgZmlsZSwgY21kLCBmbCk7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2NmczJfcGxvY2spOworCiBpbnQgb2NmczJfY2x1c3Rlcl9jb25uZWN0KGNvbnN0IGNoYXIgKnN0YWNrX25hbWUsCiAJCQkgIGNvbnN0IGNoYXIgKmdyb3VwLAogCQkJICBpbnQgZ3JvdXBsZW4sCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdGFja2dsdWUuaCBiL2ZzL29jZnMyL3N0YWNrZ2x1ZS5oCmluZGV4IGRiNTYyODEuLmM1NzFhZjMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N0YWNrZ2x1ZS5oCisrKyBiL2ZzL29jZnMyL3N0YWNrZ2x1ZS5oCkBAIC0yOCw2ICsyOCwxMCBAQAogI2luY2x1ZGUgImRsbS9kbG1hcGkuaCIKICNpbmNsdWRlIDxsaW51eC9kbG0uaD4KIAorLyogTmVlZGVkIGZvciBwbG9jay1yZWxhdGVkIHByb3RvdHlwZXMgKi8KK3N0cnVjdCBmaWxlOworc3RydWN0IGZpbGVfbG9jazsKKwogLyoKICAqIGRsbWNvbnN0YW50cy5oIGRvZXMgbm90IGhhdmUgYSBMT0NBTCBmbGFnLiAgV2UgaG9wZSB0byByZW1vdmUgaXQKICAqIHNvbWUgZGF5LCBidXQgcmlnaHQgbm93IHdlIG5lZWQgaXQuICBMZXQncyBmYWtlIGl0LiAgVGhpcyB2YWx1ZSBpcyBsYXJnZXIKQEAgLTE4Nyw2ICsxOTEsMTcgQEAKIAl2b2lkICooKmxvY2tfbHZiKSh1bmlvbiBvY2ZzMl9kbG1fbGtzYiAqbGtzYik7CiAKIAkvKgorCSAqIENsdXN0ZXItYXdhcmUgcG9zaXggbG9ja3MKKwkgKgorCSAqIFRoaXMgaXMgTlVMTCBmb3Igc3RhY2tzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHBvc2l4IGxvY2tzLgorCSAqLworCWludCAoKnBsb2NrKShzdHJ1Y3Qgb2NmczJfY2x1c3Rlcl9jb25uZWN0aW9uICpjb25uLAorCQkgICAgIHU2NCBpbm8sCisJCSAgICAgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgaW50IGNtZCwKKwkJICAgICBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CisKKwkvKgogCSAqIFRoaXMgaXMgYW4gb3B0b2luYWwgZGVidWdnaW5nIGhvb2suICBJZiBwcm92aWRlZCwgdGhlCiAJICogc3RhY2sgY2FuIGR1bXAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbG9jay4KIAkgKi8KQEAgLTI0MCw2ICsyNTUsMTAgQEAKIHZvaWQgKm9jZnMyX2RsbV9sdmIodW5pb24gb2NmczJfZGxtX2xrc2IgKmxrc2IpOwogdm9pZCBvY2ZzMl9kbG1fZHVtcF9sa3NiKHVuaW9uIG9jZnMyX2RsbV9sa3NiICpsa3NiKTsKIAoraW50IG9jZnMyX3N0YWNrX3N1cHBvcnRzX3Bsb2Nrcyh2b2lkKTsKK2ludCBvY2ZzMl9wbG9jayhzdHJ1Y3Qgb2NmczJfY2x1c3Rlcl9jb25uZWN0aW9uICpjb25uLCB1NjQgaW5vLAorCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOworCiB2b2lkIG9jZnMyX3N0YWNrX2dsdWVfc2V0X2xvY2tpbmdfcHJvdG9jb2woc3RydWN0IG9jZnMyX2xvY2tpbmdfcHJvdG9jb2wgKnByb3RvKTsKIAogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5jIGIvZnMvb2NmczIvc3ViYWxsb2MuYwppbmRleCBkMmQyNzhmLi5jNWZmMThiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5jCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKQEAgLTYyLDE1ICs2MiwxOCBAQAogCQkJCSAgc3RydWN0IG9jZnMyX2NoYWluX2xpc3QgKmNsKTsKIHN0YXRpYyBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfYWxsb2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgIHU2NCBtYXhfYmxvY2spOwogCiBzdGF0aWMgaW50IG9jZnMyX2NsdXN0ZXJfZ3JvdXBfc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCwKIAkJCQkgICAgICB1MzIgYml0c193YW50ZWQsIHUzMiBtaW5fYml0cywKKwkJCQkgICAgICB1NjQgbWF4X2Jsb2NrLAogCQkJCSAgICAgIHUxNiAqYml0X29mZiwgdTE2ICpiaXRzX2ZvdW5kKTsKIHN0YXRpYyBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCiAJCQkJICAgIHUzMiBiaXRzX3dhbnRlZCwgdTMyIG1pbl9iaXRzLAorCQkJCSAgICB1NjQgbWF4X2Jsb2NrLAogCQkJCSAgICB1MTYgKmJpdF9vZmYsIHUxNiAqYml0c19mb3VuZCk7CiBzdGF0aWMgaW50IG9jZnMyX2NsYWltX3N1YmFsbG9jX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCkBAIC0xMTAsOCArMTEzLDExIEBACiAJCQkJCQl1NjQgZGF0YV9ibGtubywKIAkJCQkJCXU2NCAqYmdfYmxrbm8sCiAJCQkJCQl1MTYgKmJnX2JpdF9vZmYpOworc3RhdGljIGludCBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzX3dpdGhfbGltaXQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJCSAgICAgdTMyIGJpdHNfd2FudGVkLCB1NjQgbWF4X2Jsb2NrLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpOwogCi1zdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX2FjX3Jlc291cmNlKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYykKK3ZvaWQgb2NmczJfZnJlZV9hY19yZXNvdXJjZShzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGFjLT5hY19pbm9kZTsKIApAQCAtMTI0LDEwICsxMzAsOCBAQAogCQlpcHV0KGlub2RlKTsKIAkJYWMtPmFjX2lub2RlID0gTlVMTDsKIAl9Ci0JaWYgKGFjLT5hY19iaCkgewotCQlicmVsc2UoYWMtPmFjX2JoKTsKLQkJYWMtPmFjX2JoID0gTlVMTDsKLQl9CisJYnJlbHNlKGFjLT5hY19iaCk7CisJYWMtPmFjX2JoID0gTlVMTDsKIH0KIAogdm9pZCBvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKQpAQCAtMjc2LDcgKzI4MCw4IEBACiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfYWxsb2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICAgdTY0IG1heF9ibG9jaykKIHsKIAlpbnQgc3RhdHVzLCBjcmVkaXRzOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgYmgtPmJfZGF0YTsKQEAgLTI5NCw5ICsyOTksOSBAQAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJY2wgPSAmZmUtPmlkMi5pX2NoYWluOwotCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLAotCQkJCQlsZTE2X3RvX2NwdShjbC0+Y2xfY3BnKSwKLQkJCQkJJmFjKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzX3dpdGhfbGltaXQob3NiLAorCQkJCQkJICAgbGUxNl90b19jcHUoY2wtPmNsX2NwZyksCisJCQkJCQkgICBtYXhfYmxvY2ssICZhYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMzk0LDggKzM5OSw3IEBACiAJaWYgKGFjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoYWMpOwogCi0JaWYgKGJnX2JoKQotCQlicmVsc2UoYmdfYmgpOworCWJyZWxzZShiZ19iaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNDY5LDcgKzQ3Myw4IEBACiAJCQlnb3RvIGJhaWw7CiAJCX0KIAotCQlzdGF0dXMgPSBvY2ZzMl9ibG9ja19ncm91cF9hbGxvYyhvc2IsIGFsbG9jX2lub2RlLCBiaCk7CisJCXN0YXR1cyA9IG9jZnMyX2Jsb2NrX2dyb3VwX2FsbG9jKG9zYiwgYWxsb2NfaW5vZGUsIGJoLAorCQkJCQkJIGFjLT5hY19tYXhfYmxvY2spOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTQ4NiwxNiArNDkxLDE1IEBACiAJZ2V0X2JoKGJoKTsKIAlhYy0+YWNfYmggPSBiaDsKIGJhaWw6Ci0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGEoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUsCi0JCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKK2ludCBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YV9ibG9ja3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJICAgICAgaW50IGJsb2NrcywKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKQogewogCWludCBzdGF0dXM7CiAJdTMyIHNsb3Q7CkBAIC01MDcsNyArNTExLDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChmZSk7CisJKCphYyktPmFjX2JpdHNfd2FudGVkID0gYmxvY2tzOwogCSgqYWMpLT5hY193aGljaCA9IE9DRlMyX0FDX1VTRV9NRVRBOwogCXNsb3QgPSBvc2ItPnNsb3RfbnVtOwogCSgqYWMpLT5hY19ncm91cF9zZWFyY2ggPSBvY2ZzMl9ibG9ja19ncm91cF9zZWFyY2g7CkBAIC01MzIsNiArNTM2LDE1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKQoreworCXJldHVybiBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YV9ibG9ja3Mob3NiLAorCQkJCQlvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQocm9vdF9lbCksCisJCQkJCWFjKTsKK30KKwogc3RhdGljIGludCBvY2ZzMl9zdGVhbF9pbm9kZV9mcm9tX290aGVyX25vZGVzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMpCiB7CkBAIC01ODIsNiArNTk1LDE0IEBACiAJKCphYyktPmFjX2dyb3VwX3NlYXJjaCA9IG9jZnMyX2Jsb2NrX2dyb3VwX3NlYXJjaDsKIAogCS8qCisJICogc3RhdCgyKSBjYW4ndCBoYW5kbGUgaV9pbm8gPiAzMmJpdHMsIHNvIHdlIHRlbGwgdGhlCisJICogbG93ZXIgbGV2ZWxzIG5vdCB0byBhbGxvY2F0ZSB1cyBhIGJsb2NrIGdyb3VwIHBhc3QgdGhhdAorCSAqIGxpbWl0LiAgVGhlICdpbm9kZTY0JyBtb3VudCBvcHRpb24gYXZvaWRzIHRoaXMgYmVoYXZpb3IuCisJICovCisJaWYgKCEob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX0lOT0RFNjQpKQorCQkoKmFjKS0+YWNfbWF4X2Jsb2NrID0gKHUzMil+MFU7CisKKwkvKgogCSAqIHNsb3QgaXMgc2V0IHdoZW4gd2Ugc3VjY2Vzc2Z1bGx5IHN0ZWFsIGlub2RlIGZyb20gb3RoZXIgbm9kZXMuCiAJICogSXQgaXMgcmVzZXQgaW4gMyBwbGFjZXM6CiAJICogMS4gd2hlbiB3ZSBmbHVzaCB0aGUgdHJ1bmNhdGUgbG9nCkBAIC02NjEsOSArNjgyLDkgQEAKIC8qIENhbGxlcnMgZG9uJ3QgbmVlZCB0byBjYXJlIHdoaWNoIGJpdG1hcCAobG9jYWwgYWxsb2Mgb3IgbWFpbikgdG8KICAqIHVzZSBzbyB3ZSBmaWd1cmUgaXQgb3V0IGZvciB0aGVtLCBidXQgdW5mb3J0dW5hdGVseSB0aGlzIGNsdXR0ZXJzCiAgKiB0aGluZ3MgYSBiaXQuICovCi1pbnQgb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgIHUzMiBiaXRzX3dhbnRlZCwKLQkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpCitzdGF0aWMgaW50IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnNfd2l0aF9saW1pdChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkJICAgICB1MzIgYml0c193YW50ZWQsIHU2NCBtYXhfYmxvY2ssCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC02NzcsMjQgKzY5OCwyMCBAQAogCX0KIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IGJpdHNfd2FudGVkOworCSgqYWMpLT5hY19tYXhfYmxvY2sgPSBtYXhfYmxvY2s7CiAKIAlzdGF0dXMgPSAtRU5PU1BDOwogCWlmIChvY2ZzMl9hbGxvY19zaG91bGRfdXNlX2xvY2FsKG9zYiwgYml0c193YW50ZWQpKSB7CiAJCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbG9jYWxfYWxsb2NfYml0cyhvc2IsCiAJCQkJCQkJYml0c193YW50ZWQsCiAJCQkJCQkJKmFjKTsKLQkJaWYgKChzdGF0dXMgPCAwKSAmJiAoc3RhdHVzICE9IC1FTk9TUEMpKSB7CisJCWlmIChzdGF0dXMgPT0gLUVGQklHKSB7CisJCQkvKiBUaGUgbG9jYWwgYWxsb2Mgd2luZG93IGlzIG91dHNpZGUgYWNfbWF4X2Jsb2NrLgorCQkJICogdXNlIHRoZSBtYWluIGJpdG1hcC4gKi8KKwkJCXN0YXR1cyA9IC1FTk9TUEM7CisJCX0gZWxzZSBpZiAoKHN0YXR1cyA8IDApICYmIChzdGF0dXMgIT0gLUVOT1NQQykpIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKLQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gLUVOT1NQQykgewotCQkJLyogcmVzZXJ2ZV9sb2NhbF9iaXRzIHdpbGwgcmV0dXJuIGVub3NwYyB3aXRoCi0JCQkgKiB0aGUgbG9jYWwgYWxsb2MgaW5vZGUgc3RpbGwgbG9ja2VkLCBzbyB3ZQotCQkJICogY2FuIGNoYW5nZSB0aGlzIHNhZmVseSBoZXJlLiAqLwotCQkJbWxvZygwLCAiRGlzYWJsaW5nIGxvY2FsIGFsbG9jXG4iKTsKLQkJCS8qIFdlIHNldCB0byBPQ0ZTMl9MQV9ESVNBQkxFRCBzbyB0aGF0IHVtb3VudAotCQkJICogY2FuIGNsZWFuIHVwIHdoYXQncyBsZWZ0IG9mIHRoZSBsb2NhbAotCQkJICogYWxsb2NhdGlvbiAqLwotCQkJb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9IE9DRlMyX0xBX0RJU0FCTEVEOwogCQl9CiAJfQogCkBAIC03MTgsNiArNzM1LDEzIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkgICB1MzIgYml0c193YW50ZWQsCisJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKQoreworCXJldHVybiBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzX3dpdGhfbGltaXQob3NiLCBiaXRzX3dhbnRlZCwgMCwgYWMpOworfQorCiAvKgogICogTW9yZSBvciBsZXNzIGxpZnRlZCBmcm9tIGV4dDMuIEknbGwgbGVhdmUgdGhlaXIgZGVzY3JpcHRpb24gYmVsb3c6CiAgKgpAQCAtMTAwMCwxMSArMTAyNCwxNCBAQAogc3RhdGljIGludCBvY2ZzMl9jbHVzdGVyX2dyb3VwX3NlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCiAJCQkJICAgICAgdTMyIGJpdHNfd2FudGVkLCB1MzIgbWluX2JpdHMsCisJCQkJICAgICAgdTY0IG1heF9ibG9jaywKIAkJCQkgICAgICB1MTYgKmJpdF9vZmYsIHUxNiAqYml0c19mb3VuZCkKIHsKIAlpbnQgc2VhcmNoID0gLUVOT1NQQzsKIAlpbnQgcmV0OworCXU2NCBibGtvZmY7CiAJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGdyb3VwX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJdTE2IHRtcF9vZmYsIHRtcF9mb3VuZDsKIAl1bnNpZ25lZCBpbnQgbWF4X2JpdHMsIGdkX2NsdXN0ZXJfb2ZmOwogCkBAIC0xMDM3LDYgKzEwNjQsMTcgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKKwkJaWYgKG1heF9ibG9jaykgeworCQkJYmxrb2ZmID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLAorCQkJCQkJCSAgZ2RfY2x1c3Rlcl9vZmYgKworCQkJCQkJCSAgdG1wX29mZiArIHRtcF9mb3VuZCk7CisJCQltbG9nKDAsICJDaGVja2luZyAlbGx1IGFnYWluc3QgJWxsdVxuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtvZmYsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWF4X2Jsb2NrKTsKKwkJCWlmIChibGtvZmYgPiBtYXhfYmxvY2spCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKwogCQkvKiBvY2ZzMl9ibG9ja19ncm91cF9maW5kX2NsZWFyX2JpdHMoKSBtaWdodAogCQkgKiByZXR1cm4gc3VjY2VzcywgYnV0IHdlIHN0aWxsIHdhbnQgdG8gcmV0dXJuCiAJCSAqIC1FTk9TUEMgdW5sZXNzIGl0IGZvdW5kIHRoZSBtaW5pbXVtIG51bWJlcgpAQCAtMTA0NSw2ICsxMDgzLDEyIEBACiAJCQkqYml0X29mZiA9IHRtcF9vZmY7CiAJCQkqYml0c19mb3VuZCA9IHRtcF9mb3VuZDsKIAkJCXNlYXJjaCA9IDA7IC8qIHN1Y2Nlc3MgKi8KKwkJfSBlbHNlIGlmICh0bXBfZm91bmQpIHsKKwkJCS8qCisJCQkgKiBEb24ndCBzaG93IGJpdHMgd2hpY2ggd2UnbGwgYmUgcmV0dXJuaW5nCisJCQkgKiBmb3IgYWxsb2NhdGlvbiB0byB0aGUgbG9jYWwgYWxsb2MgYml0bWFwLgorCQkJICovCisJCQlvY2ZzMl9sb2NhbF9hbGxvY19zZWVuX2ZyZWVfYml0cyhvc2IsIHRtcF9mb3VuZCk7CiAJCX0KIAl9CiAKQEAgLTEwNTQsMTkgKzEwOTgsMzEgQEAKIHN0YXRpYyBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCiAJCQkJICAgIHUzMiBiaXRzX3dhbnRlZCwgdTMyIG1pbl9iaXRzLAorCQkJCSAgICB1NjQgbWF4X2Jsb2NrLAogCQkJCSAgICB1MTYgKmJpdF9vZmYsIHUxNiAqYml0c19mb3VuZCkKIHsKIAlpbnQgcmV0ID0gLUVOT1NQQzsKKwl1NjQgYmxrb2ZmOwogCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpiZyA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKSBncm91cF9iaC0+Yl9kYXRhOwogCiAJQlVHX09OKG1pbl9iaXRzICE9IDEpOwogCUJVR19PTihvY2ZzMl9pc19jbHVzdGVyX2JpdG1hcChpbm9kZSkpOwogCi0JaWYgKGJnLT5iZ19mcmVlX2JpdHNfY291bnQpCisJaWYgKGJnLT5iZ19mcmVlX2JpdHNfY291bnQpIHsKIAkJcmV0ID0gb2NmczJfYmxvY2tfZ3JvdXBfZmluZF9jbGVhcl9iaXRzKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKIAkJCQkJCQlncm91cF9iaCwgYml0c193YW50ZWQsCiAJCQkJCQkJbGUxNl90b19jcHUoYmctPmJnX2JpdHMpLAogCQkJCQkJCWJpdF9vZmYsIGJpdHNfZm91bmQpOworCQlpZiAoIXJldCAmJiBtYXhfYmxvY2spIHsKKwkJCWJsa29mZiA9IGxlNjRfdG9fY3B1KGJnLT5iZ19ibGtubykgKyAqYml0X29mZiArCisJCQkJKmJpdHNfZm91bmQ7CisJCQltbG9nKDAsICJDaGVja2luZyAlbGx1IGFnYWluc3QgJWxsdVxuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtvZmYsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbWF4X2Jsb2NrKTsKKwkJCWlmIChibGtvZmYgPiBtYXhfYmxvY2spCisJCQkJcmV0ID0gLUVOT1NQQzsKKwkJfQorCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTE2LDggKzExNzIsNyBAQAogCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZDsKIAlzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlID0gYWMtPmFjX2lub2RlOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihhbGxvY19pbm9kZS0+aV9zYiksIGdkX2Jsa25vLAotCQkJICAgICAgICZncm91cF9iaCwgT0NGUzJfQkhfQ0FDSEVELCBhbGxvY19pbm9kZSk7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhhbGxvY19pbm9kZSwgZ2RfYmxrbm8sICZncm91cF9iaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTEzMSw3ICsxMTg2LDcgQEAKIAl9CiAKIAlyZXQgPSBhYy0+YWNfZ3JvdXBfc2VhcmNoKGFsbG9jX2lub2RlLCBncm91cF9iaCwgYml0c193YW50ZWQsIG1pbl9iaXRzLAotCQkJCSAgYml0X29mZiwgJmZvdW5kKTsKKwkJCQkgIGFjLT5hY19tYXhfYmxvY2ssIGJpdF9vZmYsICZmb3VuZCk7CiAJaWYgKHJldCA8IDApIHsKIAkJaWYgKHJldCAhPSAtRU5PU1BDKQogCQkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMTE4Niw5ICsxMjQxLDkgQEAKIAkgICAgIGJpdHNfd2FudGVkLCBjaGFpbiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShhbGxvY19pbm9kZSktPmlwX2Jsa25vKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoYWxsb2NfaW5vZGUtPmlfc2IpLAorCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soYWxsb2NfaW5vZGUsCiAJCQkJICBsZTY0X3RvX2NwdShjbC0+Y2xfcmVjc1tjaGFpbl0uY19ibGtubyksCi0JCQkJICAmZ3JvdXBfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgYWxsb2NfaW5vZGUpOworCQkJCSAgJmdyb3VwX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTEyMDQsMjEgKzEyNTksMjAgQEAKIAkvKiBmb3Igbm93LCB0aGUgY2hhaW4gc2VhcmNoIGlzIGEgYml0IHNpbXBsaXN0aWMuIFdlIGp1c3QgdXNlCiAJICogdGhlIDFzdCBncm91cCB3aXRoIGFueSBlbXB0eSBiaXRzLiAqLwogCXdoaWxlICgoc3RhdHVzID0gYWMtPmFjX2dyb3VwX3NlYXJjaChhbGxvY19pbm9kZSwgZ3JvdXBfYmgsCi0JCQkJCSAgICAgYml0c193YW50ZWQsIG1pbl9iaXRzLCBiaXRfb2ZmLAorCQkJCQkgICAgIGJpdHNfd2FudGVkLCBtaW5fYml0cywKKwkJCQkJICAgICBhYy0+YWNfbWF4X2Jsb2NrLCBiaXRfb2ZmLAogCQkJCQkgICAgICZ0bXBfYml0cykpID09IC1FTk9TUEMpIHsKIAkJaWYgKCFiZy0+YmdfbmV4dF9ncm91cCkKIAkJCWJyZWFrOwogCi0JCWlmIChwcmV2X2dyb3VwX2JoKSB7Ci0JCQlicmVsc2UocHJldl9ncm91cF9iaCk7Ci0JCQlwcmV2X2dyb3VwX2JoID0gTlVMTDsKLQkJfQorCQlicmVsc2UocHJldl9ncm91cF9iaCk7CisJCXByZXZfZ3JvdXBfYmggPSBOVUxMOworCiAJCW5leHRfZ3JvdXAgPSBsZTY0X3RvX2NwdShiZy0+YmdfbmV4dF9ncm91cCk7CiAJCXByZXZfZ3JvdXBfYmggPSBncm91cF9iaDsKIAkJZ3JvdXBfYmggPSBOVUxMOwotCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGFsbG9jX2lub2RlLT5pX3NiKSwKLQkJCQkJICBuZXh0X2dyb3VwLCAmZ3JvdXBfYmgsCi0JCQkJCSAgT0NGUzJfQkhfQ0FDSEVELCBhbGxvY19pbm9kZSk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soYWxsb2NfaW5vZGUsCisJCQkJCSAgbmV4dF9ncm91cCwgJmdyb3VwX2JoKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTEzMDcsMTAgKzEzNjEsOCBAQAogCSpiZ19ibGtubyA9IGxlNjRfdG9fY3B1KGJnLT5iZ19ibGtubyk7CiAJKmJpdHNfbGVmdCA9IGxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2JpdHNfY291bnQpOwogYmFpbDoKLQlpZiAoZ3JvdXBfYmgpCi0JCWJyZWxzZShncm91cF9iaCk7Ci0JaWYgKHByZXZfZ3JvdXBfYmgpCi0JCWJyZWxzZShwcmV2X2dyb3VwX2JoKTsKKwlicmVsc2UoZ3JvdXBfYmgpOworCWJyZWxzZShwcmV2X2dyb3VwX2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xNzIzLDcgKzE3NzUsNiBAQAogewogCWludCBzdGF0dXMgPSAwOwogCXUzMiB0bXBfdXNlZDsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGFsbG9jX2lub2RlLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGFsbG9jX2JoLT5iX2RhdGE7CiAJc3RydWN0IG9jZnMyX2NoYWluX2xpc3QgKmNsID0gJmZlLT5pZDIuaV9jaGFpbjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoID0gTlVMTDsKQEAgLTE3NDIsOCArMTc5Myw3IEBACiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koYWxsb2NfaW5vZGUpLT5pcF9ibGtubywgY291bnQsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJnX2Jsa25vLCBzdGFydF9iaXQpOwogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGJnX2Jsa25vLCAmZ3JvdXBfYmgsIE9DRlMyX0JIX0NBQ0hFRCwKLQkJCQkgIGFsbG9jX2lub2RlKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGFsbG9jX2lub2RlLCBiZ19ibGtubywgJmdyb3VwX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTE3ODQsOCArMTgzNCw3IEBACiAJfQogCiBiYWlsOgotCWlmIChncm91cF9iaCkKLQkJYnJlbHNlKGdyb3VwX2JoKTsKKwlicmVsc2UoZ3JvdXBfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE4MzgsOSArMTg4NywxNSBAQAogCXN0YXR1cyA9IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGUsIGJpdG1hcF9pbm9kZSwgYml0bWFwX2JoLAogCQkJCQkgIGJnX3N0YXJ0X2JpdCwgYmdfYmxrbm8sCiAJCQkJCSAgbnVtX2NsdXN0ZXJzKTsKLQlpZiAoc3RhdHVzIDwgMCkKKwlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KIAorCW9jZnMyX2xvY2FsX2FsbG9jX3NlZW5fZnJlZV9iaXRzKE9DRlMyX1NCKGJpdG1hcF9pbm9kZS0+aV9zYiksCisJCQkJCSBudW1fY2x1c3RlcnMpOworCitvdXQ6CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE4OTEsMyArMTk0Niw4NCBAQAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmZS0+aWQyLmlfY2hhaW4uY2xfcmVjc1tpXS5jX2Jsa25vKTsKIAl9CiB9CisKKy8qCisgKiBGb3IgYSBnaXZlbiBhbGxvY2F0aW9uLCBkZXRlcm1pbmUgd2hpY2ggYWxsb2NhdG9ycyB3aWxsIG5lZWQgdG8gYmUKKyAqIGFjY2Vzc2VkLCBhbmQgbG9jayB0aGVtLCByZXNlcnZpbmcgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBiaXRzLgorICoKKyAqIFNwYXJzZSBmaWxlIHN5c3RlbXMgY2FsbCB0aGlzIGZyb20gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKCkKKyAqIGFuZCBvY2ZzMl9hbGxvY2F0ZV91bndyaXR0ZW5fZXh0ZW50cygpLgorICoKKyAqIEZpbGUgc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IGhvbGVzIGNhbGwgdGhpcyBmcm9tCisgKiBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbigpLgorICovCitpbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAorCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCisJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYykKK3sKKwlpbnQgcmV0ID0gMCwgbnVtX2ZyZWVfZXh0ZW50czsKKwl1bnNpZ25lZCBpbnQgbWF4X3JlY3NfbmVlZGVkID0gY2x1c3RlcnNfdG9fYWRkICsgMiAqIGV4dGVudHNfdG9fc3BsaXQ7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwkqbWV0YV9hYyA9IE5VTEw7CisJaWYgKGRhdGFfYWMpCisJCSpkYXRhX2FjID0gTlVMTDsKKworCUJVR19PTihjbHVzdGVyc190b19hZGQgIT0gMCAmJiBkYXRhX2FjID09IE5VTEwpOworCisJbnVtX2ZyZWVfZXh0ZW50cyA9IG9jZnMyX251bV9mcmVlX2V4dGVudHMob3NiLCBpbm9kZSwgZXQpOworCWlmIChudW1fZnJlZV9leHRlbnRzIDwgMCkgeworCQlyZXQgPSBudW1fZnJlZV9leHRlbnRzOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogU3BhcnNlIGFsbG9jYXRpb24gZmlsZSBzeXN0ZW1zIG5lZWQgdG8gYmUgbW9yZSBjb25zZXJ2YXRpdmUKKwkgKiB3aXRoIHJlc2VydmluZyByb29tIGZvciBleHBhbnNpb24gLSB0aGUgYWN0dWFsIGFsbG9jYXRpb24KKwkgKiBoYXBwZW5zIHdoaWxlIHdlJ3ZlIGdvdCBhIGpvdXJuYWwgaGFuZGxlIG9wZW4gc28gcmUtdGFraW5nCisJICogYSBjbHVzdGVyIGxvY2sgKGJlY2F1c2Ugd2UgcmFuIG91dCBvZiByb29tIGZvciBhbm90aGVyCisJICogZXh0ZW50KSB3aWxsIHZpb2xhdGUgb3JkZXJpbmcgcnVsZXMuCisJICoKKwkgKiBNb3N0IG9mIHRoZSB0aW1lIHdlJ2xsIG9ubHkgYmUgc2VlaW5nIHRoaXMgMSBjbHVzdGVyIGF0IGEgdGltZQorCSAqIGFueXdheS4KKwkgKgorCSAqIEFsd2F5cyBsb2NrIGZvciBhbnkgdW53cml0dGVuIGV4dGVudHMgLSB3ZSBtaWdodCB3YW50IHRvCisJICogYWRkIGJsb2NrcyBkdXJpbmcgYSBzcGxpdC4KKwkgKi8KKwlpZiAoIW51bV9mcmVlX2V4dGVudHMgfHwKKwkgICAgKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmIG51bV9mcmVlX2V4dGVudHMgPCBtYXhfcmVjc19uZWVkZWQpKSB7CisJCXJldCA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZXQtPmV0X3Jvb3RfZWwsIG1ldGFfYWMpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKHJldCAhPSAtRU5PU1BDKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNsdXN0ZXJzX3RvX2FkZCA9PSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCBjbHVzdGVyc190b19hZGQsIGRhdGFfYWMpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJaWYgKHJldCkgeworCQlpZiAoKm1ldGFfYWMpIHsKKwkJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dCgqbWV0YV9hYyk7CisJCQkqbWV0YV9hYyA9IE5VTEw7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW5ub3QgaGF2ZSBhbiBlcnJvciBhbmQgYSBub24gbnVsbCAqZGF0YV9hYy4KKwkJICovCisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1YmFsbG9jLmggYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCmluZGV4IDU0NGM2MDAuLjRkZjE1OWQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1YmFsbG9jLmgKKysrIGIvZnMvb2NmczIvc3ViYWxsb2MuaApAQCAtMjgsMTAgKzI4LDExIEBACiAKIHR5cGVkZWYgaW50IChncm91cF9zZWFyY2hfdCkoc3RydWN0IGlub2RlICosCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqLAotCQkJICAgICB1MzIsCi0JCQkgICAgIHUzMiwKLQkJCSAgICAgdTE2ICosCi0JCQkgICAgIHUxNiAqKTsKKwkJCSAgICAgdTMyLAkJCS8qIGJpdHNfd2FudGVkICovCisJCQkgICAgIHUzMiwJCQkvKiBtaW5fYml0cyAqLworCQkJICAgICB1NjQsCQkJLyogbWF4X2Jsb2NrICovCisJCQkgICAgIHUxNiAqLAkJCS8qICpiaXRfb2ZmICovCisJCQkgICAgIHUxNiAqKTsJCQkvKiAqYml0c19mb3VuZCAqLwogCiBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCB7CiAJc3RydWN0IGlub2RlICphY19pbm9kZTsgICAgLyogd2hpY2ggYml0bWFwIGFyZSB3ZSBhbGxvY2F0aW5nIGZyb20/ICovCkBAIC01MSw2ICs1Miw4IEBACiAJZ3JvdXBfc2VhcmNoX3QgKmFjX2dyb3VwX3NlYXJjaDsKIAogCXU2NCAgICBhY19sYXN0X2dyb3VwOworCXU2NCAgICBhY19tYXhfYmxvY2s7ICAvKiBIaWdoZXN0IGJsb2NrIG51bWJlciB0byBhbGxvY2F0ZS4gMCBpcworCQkJCSBpcyB0aGUgc2FtZSBhcyB+MCAtIHVubGltaXRlZCAqLwogfTsKIAogdm9pZCBvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKTsKQEAgLTU5LDkgKzYyLDE3IEBACiAJcmV0dXJuIGFjLT5hY19iaXRzX3dhbnRlZCAtIGFjLT5hY19iaXRzX2dpdmVuOwogfQogCisvKgorICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgcm9vdF9lbCBpcyB0aGUgcm9vdAorICogb2YgZXh0ZW50IHRyZWUuIFNvIGZvciBhbiBpbm9kZSwgaXQgc2hvdWxkIGJlICZmZS0+aWQyLmlfbGlzdC4gT3RoZXJ3aXNlCisgKiB0aGUgcmVzdWx0IG1heSBiZSB3cm9uZy4KKyAqLwogaW50IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCwKIAkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKTsKK2ludCBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YV9ibG9ja3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJICAgICAgaW50IGJsb2NrcywKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKTsKIGludCBvY2ZzMl9yZXNlcnZlX25ld19pbm9kZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKTsKIGludCBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLApAQCAtMTQ3LDYgKzE1OCw3IEBACiAgKiBhcGlzIGFib3ZlLiAqLwogaW50IG9jZnMyX3Jlc2VydmVfY2x1c3Rlcl9iaXRtYXBfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMpOwordm9pZCBvY2ZzMl9mcmVlX2FjX3Jlc291cmNlKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYyk7CiAKIC8qIGdpdmVuIGEgY2x1c3RlciBvZmZzZXQsIGNhbGN1bGF0ZSB3aGljaCBibG9jayBncm91cCBpdCBiZWxvbmdzIHRvCiAgKiBhbmQgcmV0dXJuIHRoYXQgYmxvY2sgb2Zmc2V0LiAqLwpAQCAtMTU2LDQgKzE2OCw4IEBACiBpbnQgb2NmczJfY2hlY2tfZ3JvdXBfZGVzY3JpcHRvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKIAkJCQkgc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkKTsKK2ludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCSAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgdTMyIGV4dGVudHNfdG9fc3BsaXQsCisJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqZGF0YV9hYywKKwkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiptZXRhX2FjKTsKICNlbmRpZiAvKiBfQ0hBSU5BTExPQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggNzAzMzRkOC4uMzA0YjYzYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC02NCw2ICs2NCw3IEBACiAjaW5jbHVkZSAic3lzZmlsZS5oIgogI2luY2x1ZGUgInVwdG9kYXRlLmgiCiAjaW5jbHVkZSAidmVyLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKQEAgLTE1NCw2ICsxNTUsOSBAQAogCU9wdF9sb2NhbGFsbG9jLAogCU9wdF9sb2NhbGZsb2NrcywKIAlPcHRfc3RhY2ssCisJT3B0X3VzZXJfeGF0dHIsCisJT3B0X25vdXNlcl94YXR0ciwKKwlPcHRfaW5vZGU2NCwKIAlPcHRfZXJyLAogfTsKIApAQCAtMTczLDYgKzE3Nyw5IEBACiAJe09wdF9sb2NhbGFsbG9jLCAibG9jYWxhbGxvYz0lZCJ9LAogCXtPcHRfbG9jYWxmbG9ja3MsICJsb2NhbGZsb2NrcyJ9LAogCXtPcHRfc3RhY2ssICJjbHVzdGVyX3N0YWNrPSVzIn0sCisJe09wdF91c2VyX3hhdHRyLCAidXNlcl94YXR0ciJ9LAorCXtPcHRfbm91c2VyX3hhdHRyLCAibm91c2VyX3hhdHRyIn0sCisJe09wdF9pbm9kZTY0LCAiaW5vZGU2NCJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtMjA1LDEwICsyMTIsMTEgQEAKIAkJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMCk7CiAJfQogCi0JaWYgKGpvdXJuYWxfc3RhcnRfY29tbWl0KE9DRlMyX1NCKHNiKS0+am91cm5hbC0+al9qb3VybmFsLCAmdGFyZ2V0KSkgeworCWlmIChqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0KE9DRlMyX1NCKHNiKS0+am91cm5hbC0+al9qb3VybmFsLAorCQkJCSAgICAgICZ0YXJnZXQpKSB7CiAJCWlmICh3YWl0KQotCQkJbG9nX3dhaXRfY29tbWl0KE9DRlMyX1NCKHNiKS0+am91cm5hbC0+al9qb3VybmFsLAotCQkJCQl0YXJnZXQpOworCQkJamJkMl9sb2dfd2FpdF9jb21taXQoT0NGUzJfU0Ioc2IpLT5qb3VybmFsLT5qX2pvdXJuYWwsCisJCQkJCSAgICAgdGFyZ2V0KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjUsNiArMzMzLDcgQEAKIAlpZiAoIW9pKQogCQlyZXR1cm4gTlVMTDsKIAorCWpiZDJfam91cm5hbF9pbml0X2piZF9pbm9kZSgmb2ktPmlwX2ppbm9kZSwgJm9pLT52ZnNfaW5vZGUpOwogCXJldHVybiAmb2ktPnZmc19pbm9kZTsKIH0KIApAQCAtNDA2LDYgKzQxNSwxNSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwkvKiBQcm9iYWJseSBkb24ndCB3YW50IHRoaXMgb24gcmVtb3VudDsgaXQgbWlnaHQKKwkgKiBtZXNzIHdpdGggb3RoZXIgbm9kZXMgKi8KKwlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfSU5PREU2NCkgJiYKKwkgICAgKHBhcnNlZF9vcHRpb25zLm1vdW50X29wdCAmIE9DRlMyX01PVU5UX0lOT0RFNjQpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCW1sb2coTUxfRVJST1IsICJDYW5ub3QgZW5hYmxlIGlub2RlNjQgb24gcmVtb3VudFxuIik7CisJCWdvdG8gb3V0OworCX0KKwogCS8qIFdlJ3JlIGdvaW5nIHRvL2Zyb20gcmVhZG9ubHkgbW9kZS4gKi8KIAlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgIT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQkvKiBMb2NrIGhlcmUgc28gdGhlIGNoZWNrIG9mIEhBUkRfUk8gYW5kIHRoZSBwb3RlbnRpYWwKQEAgLTYzNyw3ICs2NTUsOCBAQAogCW9zYi0+c19hdGltZV9xdWFudHVtID0gcGFyc2VkX29wdGlvbnMuYXRpbWVfcXVhbnR1bTsKIAlvc2ItPnByZWZlcnJlZF9zbG90ID0gcGFyc2VkX29wdGlvbnMuc2xvdDsKIAlvc2ItPm9zYl9jb21taXRfaW50ZXJ2YWwgPSBwYXJzZWRfb3B0aW9ucy5jb21taXRfaW50ZXJ2YWw7Ci0Jb3NiLT5sb2NhbF9hbGxvY19zaXplID0gcGFyc2VkX29wdGlvbnMubG9jYWxhbGxvY19vcHQ7CisJb3NiLT5sb2NhbF9hbGxvY19kZWZhdWx0X2JpdHMgPSBvY2ZzMl9tZWdhYnl0ZXNfdG9fY2x1c3RlcnMoc2IsIHBhcnNlZF9vcHRpb25zLmxvY2FsYWxsb2Nfb3B0KTsKKwlvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPSBvc2ItPmxvY2FsX2FsbG9jX2RlZmF1bHRfYml0czsKIAogCXN0YXR1cyA9IG9jZnMyX3ZlcmlmeV91c2Vyc3BhY2Vfc3RhY2sob3NiLCAmcGFyc2VkX29wdGlvbnMpOwogCWlmIChzdGF0dXMpCkBAIC03NDMsOCArNzYyLDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogCiByZWFkX3N1cGVyX2Vycm9yOgotCWlmIChiaCAhPSBOVUxMKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAlpZiAoaW5vZGUpCiAJCWlwdXQoaW5vZGUpOwpAQCAtODQ3LDYgKzg2NSwxMiBAQAogCQljYXNlIE9wdF9kYXRhX3dyaXRlYmFjazoKIAkJCW1vcHQtPm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9EQVRBX1dSSVRFQkFDSzsKIAkJCWJyZWFrOworCQljYXNlIE9wdF91c2VyX3hhdHRyOgorCQkJbW9wdC0+bW91bnRfb3B0ICY9IH5PQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3VzZXJfeGF0dHI6CisJCQltb3B0LT5tb3VudF9vcHQgfD0gT0NGUzJfTU9VTlRfTk9VU0VSWEFUVFI7CisJCQlicmVhazsKIAkJY2FzZSBPcHRfYXRpbWVfcXVhbnR1bToKIAkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKSB7CiAJCQkJc3RhdHVzID0gMDsKQEAgLTg3Myw3ICs4OTcsNyBAQAogCQkJaWYgKG9wdGlvbiA8IDApCiAJCQkJcmV0dXJuIDA7CiAJCQlpZiAob3B0aW9uID09IDApCi0JCQkJb3B0aW9uID0gSkJEX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0U7CisJCQkJb3B0aW9uID0gSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFOwogCQkJbW9wdC0+Y29tbWl0X2ludGVydmFsID0gSFogKiBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbG9jYWxhbGxvYzoKQEAgLTkxOCw2ICs5NDIsOSBAQAogCQkJICAgICAgIE9DRlMyX1NUQUNLX0xBQkVMX0xFTik7CiAJCQltb3B0LT5jbHVzdGVyX3N0YWNrW09DRlMyX1NUQUNLX0xBQkVMX0xFTl0gPSAnXDAnOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X2lub2RlNjQ6CisJCQltb3B0LT5tb3VudF9vcHQgfD0gT0NGUzJfTU9VTlRfSU5PREU2NDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJbWxvZyhNTF9FUlJPUiwKIAkJCSAgICAgIlVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKQEAgLTkzOCw2ICs5NjUsNyBAQAogewogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IobW50LT5tbnRfc2IpOwogCXVuc2lnbmVkIGxvbmcgb3B0cyA9IG9zYi0+c19tb3VudF9vcHQ7CisJdW5zaWduZWQgaW50IGxvY2FsX2FsbG9jX21lZ3M7CiAKIAlpZiAob3B0cyAmIE9DRlMyX01PVU5UX0hCX0xPQ0FMKQogCQlzZXFfcHJpbnRmKHMsICIsX25ldGRldixoZWFydGJlYXQ9bG9jYWwiKTsKQEAgLTk3MCw4ICs5OTgsOSBAQAogCQlzZXFfcHJpbnRmKHMsICIsY29tbWl0PSV1IiwKIAkJCSAgICh1bnNpZ25lZCkgKG9zYi0+b3NiX2NvbW1pdF9pbnRlcnZhbCAvIEhaKSk7CiAKLQlpZiAob3NiLT5sb2NhbF9hbGxvY19zaXplICE9IE9DRlMyX0RFRkFVTFRfTE9DQUxfQUxMT0NfU0laRSkKLQkJc2VxX3ByaW50ZihzLCAiLGxvY2FsYWxsb2M9JWQiLCBvc2ItPmxvY2FsX2FsbG9jX3NpemUpOworCWxvY2FsX2FsbG9jX21lZ3MgPSBvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPj4gKDIwIC0gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMpOworCWlmIChsb2NhbF9hbGxvY19tZWdzICE9IE9DRlMyX0RFRkFVTFRfTE9DQUxfQUxMT0NfU0laRSkKKwkJc2VxX3ByaW50ZihzLCAiLGxvY2FsYWxsb2M9JWQiLCBsb2NhbF9hbGxvY19tZWdzKTsKIAogCWlmIChvcHRzICYgT0NGUzJfTU9VTlRfTE9DQUxGTE9DS1MpCiAJCXNlcV9wcmludGYocywgIixsb2NhbGZsb2NrcywiKTsKQEAgLTk4MCw2ICsxMDA5LDE0IEBACiAJCXNlcV9wcmludGYocywgIixjbHVzdGVyX3N0YWNrPSUuKnMiLCBPQ0ZTMl9TVEFDS19MQUJFTF9MRU4sCiAJCQkgICBvc2ItPm9zYl9jbHVzdGVyX3N0YWNrKTsKIAorCWlmIChvcHRzICYgT0NGUzJfTU9VTlRfTk9VU0VSWEFUVFIpCisJCXNlcV9wcmludGYocywgIixub3VzZXJfeGF0dHIiKTsKKwllbHNlCisJCXNlcV9wcmludGYocywgIix1c2VyX3hhdHRyIik7CisKKwlpZiAob3B0cyAmIE9DRlMyX01PVU5UX0lOT0RFNjQpCisJCXNlcV9wcmludGYocywgIixpbm9kZTY0Iik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzMiw2ICsxMTY5LDcgQEAKIAlvaS0+aXBfZGlyX3N0YXJ0X2xvb2t1cCA9IDA7CiAKIAlpbml0X3J3c2VtKCZvaS0+aXBfYWxsb2Nfc2VtKTsKKwlpbml0X3J3c2VtKCZvaS0+aXBfeGF0dHJfc2VtKTsKIAltdXRleF9pbml0KCZvaS0+aXBfaW9fbXV0ZXgpOwogCiAJb2ktPmlwX2Jsa25vID0gMFVMTDsKQEAgLTEzNzUsNiArMTQxMyw3IEBACiAJc2ItPnNfZnNfaW5mbyA9IG9zYjsKIAlzYi0+c19vcCA9ICZvY2ZzMl9zb3BzOwogCXNiLT5zX2V4cG9ydF9vcCA9ICZvY2ZzMl9leHBvcnRfb3BzOworCXNiLT5zX3hhdHRyID0gb2NmczJfeGF0dHJfaGFuZGxlcnM7CiAJc2ItPnNfdGltZV9ncmFuID0gMTsKIAlzYi0+c19mbGFncyB8PSBNU19OT0FUSU1FOwogCS8qIHRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgT19MQVJHRUZJTEUgKi8KQEAgLTE0MjEsOCArMTQ2MCwxMiBAQAogCiAJb3NiLT5zbG90X251bSA9IE9DRlMyX0lOVkFMSURfU0xPVDsKIAorCW9zYi0+c194YXR0cl9pbmxpbmVfc2l6ZSA9IGxlMTZfdG9fY3B1KAorCQkJCQlkaS0+aWQyLmlfc3VwZXIuc194YXR0cl9pbmxpbmVfc2l6ZSk7CisKIAlvc2ItPmxvY2FsX2FsbG9jX3N0YXRlID0gT0NGUzJfTEFfVU5VU0VEOwogCW9zYi0+bG9jYWxfYWxsb2NfYmggPSBOVUxMOworCUlOSVRfREVMQVlFRF9XT1JLKCZvc2ItPmxhX2VuYWJsZV93cSwgb2NmczJfbGFfZW5hYmxlX3dvcmtlcik7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvc2ItPm9zYl9tb3VudF9ldmVudCk7CiAKQEAgLTE1NjgsNiArMTYxMSw3IEBACiAJb3NiLT5maXJzdF9jbHVzdGVyX2dyb3VwX2Jsa25vID0KIAkJbGU2NF90b19jcHUoZGktPmlkMi5pX3N1cGVyLnNfZmlyc3RfY2x1c3Rlcl9ncm91cCk7CiAJb3NiLT5mc19nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZGktPmlfZnNfZ2VuZXJhdGlvbik7CisJb3NiLT51dWlkX2hhc2ggPSBsZTMyX3RvX2NwdShkaS0+aWQyLmlfc3VwZXIuc191dWlkX2hhc2gpOwogCW1sb2coMCwgInZvbF9sYWJlbDogJXNcbiIsIG9zYi0+dm9sX2xhYmVsKTsKIAltbG9nKDAsICJ1dWlkOiAlc1xuIiwgb3NiLT51dWlkX3N0cik7CiAJbWxvZygwLCAicm9vdF9ibGtubz0lbGx1LCBzeXN0ZW1fZGlyX2Jsa25vPSVsbHVcbiIsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zeW1saW5rLmMgYi9mcy9vY2ZzMi9zeW1saW5rLmMKaW5kZXggYmE5ZGJiNS4uY2JkMDNkZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ltbGluay5jCisrKyBiL2ZzL29jZnMyL3N5bWxpbmsuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAiam91cm5hbC5oIgogI2luY2x1ZGUgInN5bWxpbmsuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgogCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIApAQCAtODMsMTEgKzg0LDcgQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCi0JCQkJICBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJICBiaCwKLQkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwKLQkJCQkgIGlub2RlKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWxpbmsgPSBFUlJfUFRSKHN0YXR1cyk7CkBAIC0xNTcsOCArMTU0LDcgQEAKIAkJa3VubWFwKHBhZ2UpOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfQotCWlmIChiaCkKLQkJYnJlbHNlKGJoKTsKKwlicmVsc2UoYmgpOwogCiAJcmV0dXJuIEVSUl9QVFIoc3RhdHVzKTsKIH0KQEAgLTE2OCwxMCArMTY0LDE4IEBACiAJLmZvbGxvd19saW5rCT0gb2NmczJfZm9sbG93X2xpbmssCiAJLmdldGF0dHIJPSBvY2ZzMl9nZXRhdHRyLAogCS5zZXRhdHRyCT0gb2NmczJfc2V0YXR0ciwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IG9jZnMyX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogfTsKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG9jZnMyX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0gewogCS5yZWFkbGluawk9IG9jZnMyX3JlYWRsaW5rLAogCS5mb2xsb3dfbGluawk9IG9jZnMyX2ZvbGxvd19saW5rLAogCS5nZXRhdHRyCT0gb2NmczJfZ2V0YXR0ciwKIAkuc2V0YXR0cgk9IG9jZnMyX3NldGF0dHIsCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBvY2ZzMl9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIH07CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi91cHRvZGF0ZS5jIGIvZnMvb2NmczIvdXB0b2RhdGUuYwppbmRleCA0ZGE4ODUxLi4xODdiOTlmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi91cHRvZGF0ZS5jCisrKyBiL2ZzL29jZnMyL3VwdG9kYXRlLmMKQEAgLTUzLDcgKzUzLDExIEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+Ci0jaW5jbHVkZSA8bGludXgvamJkLmg+CisjaWZuZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECisjIGluY2x1ZGUgPGxpbnV4L2piZDIuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGxpbnV4L2piZC5oPgorI2VuZGlmCiAKICNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9VUFRPREFURQogCkBAIC01MTEsMTQgKzUxNSwxMCBAQAogCWNpLT5jaV9udW1fY2FjaGVkLS07CiB9CiAKLS8qIENhbGxlZCB3aGVuIHdlIHJlbW92ZSBhIGNodW5rIG9mIG1ldGFkYXRhIGZyb20gYW4gaW5vZGUuIFdlIGRvbid0Ci0gKiBib3RoZXIgcmV2ZXJ0aW5nIHRoaW5ncyB0byBhbiBpbmxpbmVkIGFycmF5IGluIHRoZSBjYXNlIG9mIGEgcmVtb3ZlCi0gKiB3aGljaCBtb3ZlcyB1cyBiYWNrIHVuZGVyIHRoZSBsaW1pdC4gKi8KLXZvaWQgb2NmczJfcmVtb3ZlX2Zyb21fY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3N0YXRpYyB2b2lkIG9jZnMyX3JlbW92ZV9ibG9ja19mcm9tX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgc2VjdG9yX3QgYmxvY2spCiB7CiAJaW50IGluZGV4OwotCXNlY3Rvcl90IGJsb2NrID0gYmgtPmJfYmxvY2tucjsKIAlzdHJ1Y3Qgb2NmczJfbWV0YV9jYWNoZV9pdGVtICppdGVtID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKIAlzdHJ1Y3Qgb2NmczJfY2FjaGluZ19pbmZvICpjaSA9ICZvaS0+aXBfbWV0YWRhdGFfY2FjaGU7CkBAIC01NDQsNiArNTQ0LDMwIEBACiAJCWttZW1fY2FjaGVfZnJlZShvY2ZzMl91cHRvZGF0ZV9jYWNoZXAsIGl0ZW0pOwogfQogCisvKgorICogQ2FsbGVkIHdoZW4gd2UgcmVtb3ZlIGEgY2h1bmsgb2YgbWV0YWRhdGEgZnJvbSBhbiBpbm9kZS4gV2UgZG9uJ3QKKyAqIGJvdGhlciByZXZlcnRpbmcgdGhpbmdzIHRvIGFuIGlubGluZWQgYXJyYXkgaW4gdGhlIGNhc2Ugb2YgYSByZW1vdmUKKyAqIHdoaWNoIG1vdmVzIHVzIGJhY2sgdW5kZXIgdGhlIGxpbWl0LgorICovCit2b2lkIG9jZnMyX3JlbW92ZV9mcm9tX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc2VjdG9yX3QgYmxvY2sgPSBiaC0+Yl9ibG9ja25yOworCisJb2NmczJfcmVtb3ZlX2Jsb2NrX2Zyb21fY2FjaGUoaW5vZGUsIGJsb2NrKTsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgcmVtb3ZlIHhhdHRyIGNsdXN0ZXJzIGZyb20gYW4gaW5vZGUuICovCit2b2lkIG9jZnMyX3JlbW92ZV94YXR0cl9jbHVzdGVyc19mcm9tX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBzZWN0b3JfdCBibG9jaywKKwkJCQkJICAgIHUzMiBjX2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgYl9sZW4gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpICogY19sZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgYl9sZW47IGkrKywgYmxvY2srKykKKwkJb2NmczJfcmVtb3ZlX2Jsb2NrX2Zyb21fY2FjaGUoaW5vZGUsIGJsb2NrKTsKK30KKwogaW50IF9faW5pdCBpbml0X29jZnMyX3VwdG9kYXRlX2NhY2hlKHZvaWQpCiB7CiAJb2NmczJfdXB0b2RhdGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm9jZnMyX3VwdG9kYXRlIiwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3VwdG9kYXRlLmggYi9mcy9vY2ZzMi91cHRvZGF0ZS5oCmluZGV4IDJlNzMyMDYuLjUzMWI0YjMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3VwdG9kYXRlLmgKKysrIGIvZnMvb2NmczIvdXB0b2RhdGUuaApAQCAtNDAsNiArNDAsOSBAQAogCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogdm9pZCBvY2ZzMl9yZW1vdmVfZnJvbV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK3ZvaWQgb2NmczJfcmVtb3ZlX3hhdHRyX2NsdXN0ZXJzX2Zyb21fY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHNlY3Rvcl90IGJsb2NrLAorCQkJCQkgICAgdTMyIGNfbGVuKTsKIGludCBvY2ZzMl9idWZmZXJfcmVhZF9haGVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi94YXR0ci5jIGIvZnMvb2NmczIveGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU3ODBhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIveGF0dHIuYwpAQCAtMCwwICsxLDQ4MzQgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCisgKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKKyAqCisgKiB4YXR0ci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ1JFRElUUzoKKyAqIExvdHMgb2YgY29kZSBpbiB0aGlzIGZpbGUgaXMgdGFrZW4gZnJvbSBleHQzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwbGljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvZmFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc29ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX1hBVFRSCisjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CisKKyNpbmNsdWRlICJvY2ZzMi5oIgorI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiZGxtZ2x1ZS5oIgorI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJzeW1saW5rLmgiCisjaW5jbHVkZSAic3lzZmlsZS5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiam91cm5hbC5oIgorI2luY2x1ZGUgIm9jZnMyX2ZzLmgiCisjaW5jbHVkZSAic3ViYWxsb2MuaCIKKyNpbmNsdWRlICJ1cHRvZGF0ZS5oIgorI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorCisKK3N0cnVjdCBvY2ZzMl94YXR0cl9kZWZfdmFsdWVfcm9vdCB7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QJeHY7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMJCWVyOworfTsKKworc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbT0NGUzJfWEFUVFJfTUFYX0JMT0NLU19QRVJfQlVDS0VUXTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aDsKK307CisKKyNkZWZpbmUgT0NGUzJfWEFUVFJfUk9PVF9TSVpFCShzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2RlZl92YWx1ZV9yb290KSkKKyNkZWZpbmUgT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUJODAKKworc3RhdGljIHN0cnVjdCBvY2ZzMl94YXR0cl9kZWZfdmFsdWVfcm9vdCBkZWZfeHYgPSB7CisJLnh2LnhyX2xpc3QubF9jb3VudCA9IGNwdV90b19sZTE2KDEpLAorfTsKKworc3RydWN0IHhhdHRyX2hhbmRsZXIgKm9jZnMyX3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJm9jZnMyX3hhdHRyX3VzZXJfaGFuZGxlciwKKwkmb2NmczJfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqb2NmczJfeGF0dHJfaGFuZGxlcl9tYXBbXSA9IHsKKwlbT0NGUzJfWEFUVFJfSU5ERVhfVVNFUl0JPSAmb2NmczJfeGF0dHJfdXNlcl9oYW5kbGVyLAorCVtPQ0ZTMl9YQVRUUl9JTkRFWF9UUlVTVEVEXQk9ICZvY2ZzMl94YXR0cl90cnVzdGVkX2hhbmRsZXIsCit9OworCitzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyB7CisJaW50IG5hbWVfaW5kZXg7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCB2b2lkICp2YWx1ZTsKKwlzaXplX3QgdmFsdWVfbGVuOworfTsKKworc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9iaDsKKwkvKgorCSAqIHhhdHRyX2JoIHBvaW50IHRvIHRoZSBibG9jayBidWZmZXIgaGVhZCB3aGljaCBoYXMgZXh0ZW5kZWQgYXR0cmlidXRlCisJICogd2hlbiBleHRlbmRlZCBhdHRyaWJ1dGUgaW4gaW5vZGUsIHhhdHRyX2JoIGlzIGVxdWFsIHRvIGlub2RlX2JoLgorCSAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqeGF0dHJfYmg7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgYnVja2V0OworCXZvaWQgKmJhc2U7CisJdm9pZCAqZW5kOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqaGVyZTsKKwlpbnQgbm90X2ZvdW5kOworfTsKKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9idWNrZXRfZ2V0X25hbWVfdmFsdWUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCwKKwkJCQkJICAgICBpbnQgaW5kZXgsCisJCQkJCSAgICAgaW50ICpibG9ja19vZmYsCisJCQkJCSAgICAgaW50ICpuZXdfb2Zmc2V0KTsKKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9pbmRleF9ibG9ja19maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKKwkJCQkJaW50IG5hbWVfaW5kZXgsCisJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKTsKKworc3RhdGljIGludCBvY2ZzMl94YXR0cl90cmVlX2xpc3RfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3RyZWVfcm9vdCAqeHQsCisJCQkJCWNoYXIgKmJ1ZmZlciwKKwkJCQkJc2l6ZV90IGJ1ZmZlcl9zaXplKTsKKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9jcmVhdGVfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cyk7CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luZGV4X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKTsKKworc3RhdGljIGludCBvY2ZzMl9kZWxldGVfeGF0dHJfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiX2JoKTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpvY2ZzMl94YXR0cl9wcmVmaXgoaW50IG5hbWVfaW5kZXgpCit7CisJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIgPSBOVUxMOworCisJaWYgKG5hbWVfaW5kZXggPiAwICYmIG5hbWVfaW5kZXggPCBPQ0ZTMl9YQVRUUl9NQVgpCisJCWhhbmRsZXIgPSBvY2ZzMl94YXR0cl9oYW5kbGVyX21hcFtuYW1lX2luZGV4XTsKKworCXJldHVybiBoYW5kbGVyID8gaGFuZGxlci0+cHJlZml4IDogTlVMTDsKK30KKworc3RhdGljIHUzMiBvY2ZzMl94YXR0cl9uYW1lX2hhc2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgaW50IG5hbWVfbGVuKQoreworCS8qIEdldCBoYXNoIHZhbHVlIG9mIHV1aWQgZnJvbSBzdXBlciBibG9jayAqLworCXUzMiBoYXNoID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT51dWlkX2hhc2g7CisJaW50IGk7CisKKwkvKiBoYXNoIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lICovCisJZm9yIChpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspIHsKKwkJaGFzaCA9IChoYXNoIDw8IE9DRlMyX0hBU0hfU0hJRlQpIF4KKwkJICAgICAgIChoYXNoID4+ICg4KnNpemVvZihoYXNoKSAtIE9DRlMyX0hBU0hfU0hJRlQpKSBeCisJCSAgICAgICAqbmFtZSsrOworCX0KKworCXJldHVybiBoYXNoOworfQorCisvKgorICogb2NmczJfeGF0dHJfaGFzaF9lbnRyeSgpCisgKgorICogQ29tcHV0ZSB0aGUgaGFzaCBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX2hhc2hfZW50cnkoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXIsCisJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwl1MzIgaGFzaCA9IDA7CisJY2hhciAqbmFtZSA9IChjaGFyICopaGVhZGVyICsgbGUxNl90b19jcHUoZW50cnktPnhlX25hbWVfb2Zmc2V0KTsKKworCWhhc2ggPSBvY2ZzMl94YXR0cl9uYW1lX2hhc2goaW5vZGUsIG5hbWUsIGVudHJ5LT54ZV9uYW1lX2xlbik7CisJZW50cnktPnhlX25hbWVfaGFzaCA9IGNwdV90b19sZTMyKGhhc2gpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICp4YXR0cl9iaCwKKwkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4dikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgcmVzdGFydF9mdW5jID0gMDsKKwlpbnQgY3JlZGl0cyA9IDA7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKKwllbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCB3aHk7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJdTMyIHByZXZfY2x1c3RlcnMsIGxvZ2ljYWxfc3RhcnQgPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKworCW1sb2coMCwgIihjbHVzdGVyc190b19hZGQgZm9yIHhhdHRyPSAldSlcbiIsIGNsdXN0ZXJzX3RvX2FkZCk7CisKKwlvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHhhdHRyX2JoLCB4dik7CisKK3Jlc3RhcnRfYWxsOgorCisJc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIGNsdXN0ZXJzX3RvX2FkZCwgMCwKKwkJCQkgICAgICAgJmRhdGFfYWMsICZtZXRhX2FjKTsKKwlpZiAoc3RhdHVzKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLCBldC5ldF9yb290X2VsLAorCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWhhbmRsZSA9IE5VTEw7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKK3Jlc3RhcnRlZF90cmFuc2FjdGlvbjoKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4YXR0cl9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCXByZXZfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpOworCXN0YXR1cyA9IG9jZnMyX2FkZF9jbHVzdGVyc19pbl9idHJlZShvc2IsCisJCQkJCSAgICAgaW5vZGUsCisJCQkJCSAgICAgJmxvZ2ljYWxfc3RhcnQsCisJCQkJCSAgICAgY2x1c3RlcnNfdG9fYWRkLAorCQkJCQkgICAgIDAsCisJCQkJCSAgICAgJmV0LAorCQkJCQkgICAgIGhhbmRsZSwKKwkJCQkJICAgICBkYXRhX2FjLAorCQkJCQkgICAgIG1ldGFfYWMsCisJCQkJCSAgICAgJndoeSk7CisJaWYgKChzdGF0dXMgPCAwKSAmJiAoc3RhdHVzICE9IC1FQUdBSU4pKSB7CisJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeGF0dHJfYmgpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwljbHVzdGVyc190b19hZGQgLT0gbGUzMl90b19jcHUoeHYtPnhyX2NsdXN0ZXJzKSAtIHByZXZfY2x1c3RlcnM7CisKKwlpZiAod2h5ICE9IFJFU1RBUlRfTk9ORSAmJiBjbHVzdGVyc190b19hZGQpIHsKKwkJaWYgKHdoeSA9PSBSRVNUQVJUX01FVEEpIHsKKwkJCW1sb2coMCwgInJlc3RhcnRpbmcgZnVuY3Rpb24uXG4iKTsKKwkJCXJlc3RhcnRfZnVuYyA9IDE7CisJCX0gZWxzZSB7CisJCQlCVUdfT04od2h5ICE9IFJFU1RBUlRfVFJBTlMpOworCisJCQltbG9nKDAsICJyZXN0YXJ0aW5nIHRyYW5zYWN0aW9uLlxuIik7CisJCQkvKiBUT0RPOiBUaGlzIGNhbiBiZSBtb3JlIGludGVsbGlnZW50LiAqLworCQkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMob3NiLT5zYiwKKwkJCQkJCQkgICAgZXQuZXRfcm9vdF9lbCwKKwkJCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkKTsKKwkJCXN0YXR1cyA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQkvKiBoYW5kbGUgc3RpbGwgaGFzIHRvIGJlIGNvbW1pdHRlZCBhdAorCQkJCSAqIHRoaXMgcG9pbnQuICovCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQkJZ290byBsZWF2ZTsKKwkJCX0KKwkJCWdvdG8gcmVzdGFydGVkX3RyYW5zYWN0aW9uOworCQl9CisJfQorCitsZWF2ZToKKwlpZiAoaGFuZGxlKSB7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisJCWhhbmRsZSA9IE5VTEw7CisJfQorCWlmIChkYXRhX2FjKSB7CisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKKwkJZGF0YV9hYyA9IE5VTEw7CisJfQorCWlmIChtZXRhX2FjKSB7CisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKwkJbWV0YV9hYyA9IE5VTEw7CisJfQorCWlmICgoIXN0YXR1cykgJiYgcmVzdGFydF9mdW5jKSB7CisJCXJlc3RhcnRfZnVuYyA9IDA7CisJCWdvdG8gcmVzdGFydF9hbGw7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX29jZnMyX3JlbW92ZV94YXR0cl9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYsCisJCQkJICAgICAgdTMyIGNwb3MsIHUzMiBwaHlzX2Nwb3MsIHUzMiBsZW4sCisJCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldDsKKwl1NjQgcGh5c19ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcGh5c19jcG9zKTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OworCisJb2NmczJfaW5pdF94YXR0cl92YWx1ZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCByb290X2JoLCB4dik7CisKKwlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwgMCwgMSwgTlVMTCwgJm1ldGFfYWMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2gob3NiKSkgeworCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByb290X2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXJldCA9IG9jZnMyX3JlbW92ZV9leHRlbnQoaW5vZGUsICZldCwgY3BvcywgbGVuLCBoYW5kbGUsIG1ldGFfYWMsCisJCQkJICBkZWFsbG9jKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCWxlMzJfYWRkX2NwdSgmeHYtPnhyX2NsdXN0ZXJzLCAtbGVuKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByb290X2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXJldCA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsIHBoeXNfYmxrbm8sIGxlbik7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zaHJpbmtfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHUzMiBvbGRfY2x1c3RlcnMsCisJCQkJICAgdTMyIG5ld19jbHVzdGVycywKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsCisJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2KQoreworCWludCByZXQgPSAwOworCXUzMiB0cnVuY19sZW4sIGNwb3MsIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZTsKKwl1NjQgYmxvY2s7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgZGVhbGxvYzsKKworCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCZkZWFsbG9jKTsKKworCWlmIChvbGRfY2x1c3RlcnMgPD0gbmV3X2NsdXN0ZXJzKQorCQlyZXR1cm4gMDsKKworCWNwb3MgPSBuZXdfY2x1c3RlcnM7CisJdHJ1bmNfbGVuID0gb2xkX2NsdXN0ZXJzIC0gbmV3X2NsdXN0ZXJzOworCXdoaWxlICh0cnVuY19sZW4pIHsKKwkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAorCQkJCQkgICAgICAgJmFsbG9jX3NpemUsICZ4di0+eHJfbGlzdCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGFsbG9jX3NpemUgPiB0cnVuY19sZW4pCisJCQlhbGxvY19zaXplID0gdHJ1bmNfbGVuOworCisJCXJldCA9IF9fb2NmczJfcmVtb3ZlX3hhdHRyX3JhbmdlKGlub2RlLCByb290X2JoLCB4diwgY3BvcywKKwkJCQkJCSBwaHlzX2Nwb3MsIGFsbG9jX3NpemUsCisJCQkJCQkgJmRlYWxsb2MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJsb2NrID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwaHlzX2Nwb3MpOworCQlvY2ZzMl9yZW1vdmVfeGF0dHJfY2x1c3RlcnNfZnJvbV9jYWNoZShpbm9kZSwgYmxvY2ssCisJCQkJCQkgICAgICAgYWxsb2Nfc2l6ZSk7CisJCWNwb3MgKz0gYWxsb2Nfc2l6ZTsKKwkJdHJ1bmNfbGVuIC09IGFsbG9jX3NpemU7CisJfQorCitvdXQ6CisJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJmRlYWxsb2MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYsCisJCQkJICAgICAgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCXUzMiBuZXdfY2x1c3RlcnMgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsIGxlbik7CisJdTMyIG9sZF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHh2LT54cl9jbHVzdGVycyk7CisKKwlpZiAobmV3X2NsdXN0ZXJzID09IG9sZF9jbHVzdGVycykKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV3X2NsdXN0ZXJzID4gb2xkX2NsdXN0ZXJzKQorCQlyZXQgPSBvY2ZzMl94YXR0cl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwKKwkJCQkJCSAgICBuZXdfY2x1c3RlcnMgLSBvbGRfY2x1c3RlcnMsCisJCQkJCQkgICAgcm9vdF9iaCwgeHYpOworCWVsc2UKKwkJcmV0ID0gb2NmczJfeGF0dHJfc2hyaW5rX3NpemUoaW5vZGUsCisJCQkJCSAgICAgIG9sZF9jbHVzdGVycywgbmV3X2NsdXN0ZXJzLAorCQkJCQkgICAgICByb290X2JoLCB4dik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2xpc3RfZW50cnkoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKwkJCQkgIHNpemVfdCAqcmVzdWx0LCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4pCit7CisJY2hhciAqcCA9IGJ1ZmZlciArICpyZXN1bHQ7CisJaW50IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKKwlpbnQgdG90YWxfbGVuID0gcHJlZml4X2xlbiArIG5hbWVfbGVuICsgMTsKKworCSpyZXN1bHQgKz0gdG90YWxfbGVuOworCisJLyogd2UgYXJlIGp1c3QgbG9va2luZyBmb3IgaG93IGJpZyBvdXIgYnVmZmVyIG5lZWRzIHRvIGJlICovCisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKworCWlmICgqcmVzdWx0ID4gc2l6ZSkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwltZW1jcHkocCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKwltZW1jcHkocCArIHByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwlwW3ByZWZpeF9sZW4gKyBuYW1lX2xlbl0gPSAnXDAnOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfbGlzdF9lbnRyaWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmhlYWRlciwKKwkJCQkgICAgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc2l6ZV90IHJlc3VsdCA9IDA7CisJaW50IGksIHR5cGUsIHJldDsKKwljb25zdCBjaGFyICpwcmVmaXgsICpuYW1lOworCisJZm9yIChpID0gMCA7IGkgPCBsZTE2X3RvX2NwdShoZWFkZXItPnhoX2NvdW50KTsgaSsrKSB7CisJCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqZW50cnkgPSAmaGVhZGVyLT54aF9lbnRyaWVzW2ldOworCQl0eXBlID0gb2NmczJfeGF0dHJfZ2V0X3R5cGUoZW50cnkpOworCQlwcmVmaXggPSBvY2ZzMl94YXR0cl9wcmVmaXgodHlwZSk7CisKKwkJaWYgKHByZWZpeCkgeworCQkJbmFtZSA9IChjb25zdCBjaGFyICopaGVhZGVyICsKKwkJCQlsZTE2X3RvX2NwdShlbnRyeS0+eGVfbmFtZV9vZmZzZXQpOworCisJCQlyZXQgPSBvY2ZzMl94YXR0cl9saXN0X2VudHJ5KGJ1ZmZlciwgYnVmZmVyX3NpemUsCisJCQkJCQkgICAgICZyZXN1bHQsIHByZWZpeCwgbmFtZSwKKwkJCQkJCSAgICAgZW50cnktPnhlX25hbWVfbGVuKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfaWJvZHlfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJICBjaGFyICpidWZmZXIsCisJCQkJICBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpKQorCQlyZXR1cm4gcmV0OworCisJaGVhZGVyID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKikKKwkJICgodm9pZCAqKWRpICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkJIGxlMTZfdG9fY3B1KGRpLT5pX3hhdHRyX2lubGluZV9zaXplKSk7CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9saXN0X2VudHJpZXMoaW5vZGUsIGhlYWRlciwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2Jsb2NrX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAorCQkJCSAgY2hhciAqYnVmZmVyLAorCQkJCSAgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxrX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiOworCWludCByZXQgPSAwOworCisJaWYgKCFkaS0+aV94YXR0cl9sb2MpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsZTY0X3RvX2NwdShkaS0+aV94YXR0cl9sb2MpLCAmYmxrX2JoKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCS8qVmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgeGF0dHIgYmxvY2sqLworCWlmIChtZW1jbXAoKHZvaWQgKilibGtfYmgtPmJfZGF0YSwgT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFLAorCQkgICBzdHJsZW4oT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFKSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOworCisJaWYgKCEobGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKSAmIE9DRlMyX1hBVFRSX0lOREVYRUQpKSB7CisJCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmhlYWRlciA9ICZ4Yi0+eGJfYXR0cnMueGJfaGVhZGVyOworCQlyZXQgPSBvY2ZzMl94YXR0cl9saXN0X2VudHJpZXMoaW5vZGUsIGhlYWRlciwKKwkJCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCX0gZWxzZSB7CisJCXN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX3Jvb3QgKnh0ID0gJnhiLT54Yl9hdHRycy54Yl9yb290OworCQlyZXQgPSBvY2ZzMl94YXR0cl90cmVlX2xpc3RfaW5kZXhfYmxvY2soaW5vZGUsIHh0LAorCQkJCQkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJfQorY2xlYW51cDoKKwlicmVsc2UoYmxrX2JoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3Qgb2NmczJfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCWNoYXIgKmJ1ZmZlciwKKwkJCXNpemVfdCBzaXplKQoreworCWludCByZXQgPSAwLCBpX3JldCA9IDAsIGJfcmV0ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShkZW50cnktPmRfaW5vZGUpOworCisJaWYgKCFvY2ZzMl9zdXBwb3J0c194YXR0cihPQ0ZTMl9TQihkZW50cnktPmRfc2IpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0hBU19YQVRUUl9GTCkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKGRlbnRyeS0+ZF9pbm9kZSwgJmRpX2JoLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisKKwlkb3duX3JlYWQoJm9pLT5pcF94YXR0cl9zZW0pOworCWlfcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfbGlzdChkZW50cnktPmRfaW5vZGUsIGRpLCBidWZmZXIsIHNpemUpOworCWlmIChpX3JldCA8IDApCisJCWJfcmV0ID0gMDsKKwllbHNlIHsKKwkJaWYgKGJ1ZmZlcikgeworCQkJYnVmZmVyICs9IGlfcmV0OworCQkJc2l6ZSAtPSBpX3JldDsKKwkJfQorCQliX3JldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX2xpc3QoZGVudHJ5LT5kX2lub2RlLCBkaSwKKwkJCQkJICAgICAgIGJ1ZmZlciwgc2l6ZSk7CisJCWlmIChiX3JldCA8IDApCisJCQlpX3JldCA9IDA7CisJfQorCXVwX3JlYWQoJm9pLT5pcF94YXR0cl9zZW0pOworCW9jZnMyX2lub2RlX3VubG9jayhkZW50cnktPmRfaW5vZGUsIDApOworCisJYnJlbHNlKGRpX2JoKTsKKworCXJldHVybiBpX3JldCArIGJfcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2ZpbmRfZW50cnkoaW50IG5hbWVfaW5kZXgsCisJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICplbnRyeTsKKwlzaXplX3QgbmFtZV9sZW47CisJaW50IGksIGNtcCA9IDE7CisKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5hbWVfbGVuID0gc3RybGVuKG5hbWUpOworCWVudHJ5ID0geHMtPmhlcmU7CisJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHhzLT5oZWFkZXItPnhoX2NvdW50KTsgaSsrKSB7CisJCWNtcCA9IG5hbWVfaW5kZXggLSBvY2ZzMl94YXR0cl9nZXRfdHlwZShlbnRyeSk7CisJCWlmICghY21wKQorCQkJY21wID0gbmFtZV9sZW4gLSBlbnRyeS0+eGVfbmFtZV9sZW47CisJCWlmICghY21wKQorCQkJY21wID0gbWVtY21wKG5hbWUsICh4cy0+YmFzZSArCisJCQkJICAgICBsZTE2X3RvX2NwdShlbnRyeS0+eGVfbmFtZV9vZmZzZXQpKSwKKwkJCQkgICAgIG5hbWVfbGVuKTsKKwkJaWYgKGNtcCA9PSAwKQorCQkJYnJlYWs7CisJCWVudHJ5ICs9IDE7CisJfQorCXhzLT5oZXJlID0gZW50cnk7CisKKwlyZXR1cm4gY21wID8gLUVOT0RBVEEgOiAwOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2dldF92YWx1ZV9vdXRzaWRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYsCisJCQkJCSB2b2lkICpidWZmZXIsCisJCQkJCSBzaXplX3QgbGVuKQoreworCXUzMiBjcG9zLCBwX2NsdXN0ZXIsIG51bV9jbHVzdGVycywgYnBjLCBjbHVzdGVyczsKKwl1NjQgYmxrbm87CisJaW50IGksIHJldCA9IDA7CisJc2l6ZV90IGNwbGVuLCBibG9ja3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCWVsID0gJnh2LT54cl9saXN0OworCWNsdXN0ZXJzID0gbGUzMl90b19jcHUoeHYtPnhyX2NsdXN0ZXJzKTsKKwlicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOworCWJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCWNwb3MgPSAwOworCXdoaWxlIChjcG9zIDwgY2x1c3RlcnMpIHsKKwkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcF9jbHVzdGVyLAorCQkJCQkgICAgICAgJm51bV9jbHVzdGVycywgZWwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwX2NsdXN0ZXIpOworCQkvKiBDb3B5IG9jZnMyX3hhdHRyX3ZhbHVlICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2x1c3RlcnMgKiBicGM7IGkrKywgYmxrbm8rKykgeworCQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQljcGxlbiA9IGxlbiA+PSBibG9ja3NpemUgPyBibG9ja3NpemUgOiBsZW47CisJCQltZW1jcHkoYnVmZmVyLCBiaC0+Yl9kYXRhLCBjcGxlbik7CisJCQlsZW4gLT0gY3BsZW47CisJCQlidWZmZXIgKz0gY3BsZW47CisKKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IE5VTEw7CisJCQlpZiAobGVuID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJY3BvcyArPSBudW1fY2x1c3RlcnM7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfaWJvZHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIGludCBuYW1lX2luZGV4LAorCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCSB2b2lkICpidWZmZXIsCisJCQkJIHNpemVfdCBidWZmZXJfc2l6ZSwKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXhzLT5pbm9kZV9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4djsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwl4cy0+ZW5kID0gKHZvaWQgKilkaSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl4cy0+aGVhZGVyID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKikKKwkJCSh4cy0+ZW5kIC0gbGUxNl90b19jcHUoZGktPmlfeGF0dHJfaW5saW5lX3NpemUpKTsKKwl4cy0+YmFzZSA9ICh2b2lkICopeHMtPmhlYWRlcjsKKwl4cy0+aGVyZSA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9maW5kX2VudHJ5KG5hbWVfaW5kZXgsIG5hbWUsIHhzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXNpemUgPSBsZTY0X3RvX2NwdSh4cy0+aGVyZS0+eGVfdmFsdWVfc2l6ZSk7CisJaWYgKGJ1ZmZlcikgeworCQlpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkpIHsKKwkJCW1lbWNweShidWZmZXIsICh2b2lkICopeHMtPmJhc2UgKworCQkJICAgICAgIGxlMTZfdG9fY3B1KHhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCkgKworCQkJICAgICAgIE9DRlMyX1hBVFRSX1NJWkUoeHMtPmhlcmUtPnhlX25hbWVfbGVuKSwgc2l6ZSk7CisJCX0gZWxzZSB7CisJCQl4diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQorCQkJCSh4cy0+YmFzZSArIGxlMTZfdG9fY3B1KAorCQkJCSB4cy0+aGVyZS0+eGVfbmFtZV9vZmZzZXQpICsKKwkJCQlPQ0ZTMl9YQVRUUl9TSVpFKHhzLT5oZXJlLT54ZV9uYW1lX2xlbikpOworCQkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHh2LAorCQkJCQkJCSAgICBidWZmZXIsIHNpemUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2Jsb2NrX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBpbnQgbmFtZV9pbmRleCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgdm9pZCAqYnVmZmVyLAorCQkJCSBzaXplX3QgYnVmZmVyX3NpemUsCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQoreworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil4cy0+aW5vZGVfYmgtPmJfZGF0YTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJsa19iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YjsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHY7CisJc2l6ZV90IHNpemU7CisJaW50IHJldCA9IC1FTk9EQVRBLCBuYW1lX29mZnNldCwgbmFtZV9sZW4sIGJsb2NrX29mZiwgaTsKKworCWlmICghZGktPmlfeGF0dHJfbG9jKQorCQlyZXR1cm4gcmV0OworCisJbWVtc2V0KCZ4cy0+YnVja2V0LCAwLCBzaXplb2YoeHMtPmJ1Y2tldCkpOworCisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgbGU2NF90b19jcHUoZGktPmlfeGF0dHJfbG9jKSwgJmJsa19iaCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKlZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mIHhhdHRyIGJsb2NrKi8KKwlpZiAobWVtY21wKCh2b2lkICopYmxrX2JoLT5iX2RhdGEsIE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRSwKKwkJICAgc3RybGVuKE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRSkpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwl4cy0+eGF0dHJfYmggPSBibGtfYmg7CisJeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmxrX2JoLT5iX2RhdGE7CisKKwlpZiAoIShsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKKwkJeHMtPmhlYWRlciA9ICZ4Yi0+eGJfYXR0cnMueGJfaGVhZGVyOworCQl4cy0+YmFzZSA9ICh2b2lkICopeHMtPmhlYWRlcjsKKwkJeHMtPmVuZCA9ICh2b2lkICopKGJsa19iaC0+Yl9kYXRhKSArIGJsa19iaC0+Yl9zaXplOworCQl4cy0+aGVyZSA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CisKKwkJcmV0ID0gb2NmczJfeGF0dHJfZmluZF9lbnRyeShuYW1lX2luZGV4LCBuYW1lLCB4cyk7CisJfSBlbHNlCisJCXJldCA9IG9jZnMyX3hhdHRyX2luZGV4X2Jsb2NrX2ZpbmQoaW5vZGUsIGJsa19iaCwKKwkJCQkJCSAgIG5hbWVfaW5kZXgsCisJCQkJCQkgICBuYW1lLCB4cyk7CisKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFudXA7CisJc2l6ZSA9IGxlNjRfdG9fY3B1KHhzLT5oZXJlLT54ZV92YWx1ZV9zaXplKTsKKwlpZiAoYnVmZmVyKSB7CisJCXJldCA9IC1FUkFOR0U7CisJCWlmIChzaXplID4gYnVmZmVyX3NpemUpCisJCQlnb3RvIGNsZWFudXA7CisKKwkJbmFtZV9vZmZzZXQgPSBsZTE2X3RvX2NwdSh4cy0+aGVyZS0+eGVfbmFtZV9vZmZzZXQpOworCQluYW1lX2xlbiA9IE9DRlMyX1hBVFRSX1NJWkUoeHMtPmhlcmUtPnhlX25hbWVfbGVuKTsKKwkJaSA9IHhzLT5oZXJlIC0geHMtPmhlYWRlci0+eGhfZW50cmllczsKKworCQlpZiAobGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKSAmIE9DRlMyX1hBVFRSX0lOREVYRUQpIHsKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShpbm9kZSwKKwkJCQkJCQkJeHMtPmJ1Y2tldC54aCwKKwkJCQkJCQkJaSwKKwkJCQkJCQkJJmJsb2NrX29mZiwKKwkJCQkJCQkJJm5hbWVfb2Zmc2V0KTsKKwkJCXhzLT5iYXNlID0geHMtPmJ1Y2tldC5iaHNbYmxvY2tfb2ZmXS0+Yl9kYXRhOworCQl9CisJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkpIHsKKwkJCW1lbWNweShidWZmZXIsICh2b2lkICopeHMtPmJhc2UgKworCQkJICAgICAgIG5hbWVfb2Zmc2V0ICsgbmFtZV9sZW4sIHNpemUpOworCQl9IGVsc2UgeworCQkJeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikKKwkJCQkoeHMtPmJhc2UgKyBuYW1lX29mZnNldCArIG5hbWVfbGVuKTsKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2dldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4diwKKwkJCQkJCQkgICAgYnVmZmVyLCBzaXplKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfQorCX0KKwlyZXQgPSBzaXplOworY2xlYW51cDoKKwlmb3IgKGkgPSAwOyBpIDwgT0NGUzJfWEFUVFJfTUFYX0JMT0NLU19QRVJfQlVDS0VUOyBpKyspCisJCWJyZWxzZSh4cy0+YnVja2V0LmJoc1tpXSk7CisJbWVtc2V0KCZ4cy0+YnVja2V0LCAwLCBzaXplb2YoeHMtPmJ1Y2tldCkpOworCisJYnJlbHNlKGJsa19iaCk7CisJcmV0dXJuIHJldDsKK30KKworLyogb2NmczJfeGF0dHJfZ2V0KCkKKyAqCisgKiBDb3B5IGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBpbnRvIHRoZSBidWZmZXIgcHJvdmlkZWQuCisgKiBCdWZmZXIgaXMgTlVMTCB0byBjb21wdXRlIHRoZSBzaXplIG9mIGJ1ZmZlciByZXF1aXJlZC4KKyAqLworaW50IG9jZnMyX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgaW50IG5hbWVfaW5kZXgsCisJCSAgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgdm9pZCAqYnVmZmVyLAorCQkgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggeGlzID0geworCQkubm90X2ZvdW5kID0gLUVOT0RBVEEsCisJfTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhicyA9IHsKKwkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAorCX07CisKKwlpZiAoIW9jZnMyX3N1cHBvcnRzX3hhdHRyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9IQVNfWEFUVFJfRkwpKQorCQlyZXQgPSAtRU5PREFUQTsKKworCXJldCA9IG9jZnMyX2lub2RlX2xvY2soaW5vZGUsICZkaV9iaCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwl4aXMuaW5vZGVfYmggPSB4YnMuaW5vZGVfYmggPSBkaV9iaDsKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCWRvd25fcmVhZCgmb2ktPmlwX3hhdHRyX3NlbSk7CisJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfZ2V0KGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsCisJCQkJICAgIGJ1ZmZlcl9zaXplLCAmeGlzKTsKKwlpZiAocmV0ID09IC1FTk9EQVRBKQorCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkJICAgIGJ1ZmZlcl9zaXplLCAmeGJzKTsKKwl1cF9yZWFkKCZvaS0+aXBfeGF0dHJfc2VtKTsKKwlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDApOworCisJYnJlbHNlKGRpX2JoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYsCisJCQkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkJCQkgICBpbnQgdmFsdWVfbGVuKQoreworCWludCByZXQgPSAwLCBpLCBjcF9sZW4sIGNyZWRpdHM7CisJdTE2IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1MzIgcF9jbHVzdGVyLCBudW1fY2x1c3RlcnM7CisJdTMyIGNwb3MgPSAwLCBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOworCXUzMiBjbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgdmFsdWVfbGVuKTsKKwl1NjQgYmxrbm87CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCUJVR19PTihjbHVzdGVycyA+IGxlMzJfdG9fY3B1KHh2LT54cl9jbHVzdGVycykpOworCisJY3JlZGl0cyA9IGNsdXN0ZXJzICogYnBjOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgY3JlZGl0cyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoY3BvcyA8IGNsdXN0ZXJzKSB7CisJCXJldCA9IG9jZnMyX3hhdHRyX2dldF9jbHVzdGVycyhpbm9kZSwgY3BvcywgJnBfY2x1c3RlciwKKwkJCQkJICAgICAgICZudW1fY2x1c3RlcnMsICZ4di0+eHJfbGlzdCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCisJCWJsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwX2NsdXN0ZXIpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2x1c3RlcnMgKiBicGM7IGkrKywgYmxrbm8rKykgeworCQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCX0KKworCQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJICAgaW5vZGUsCisJCQkJCQkgICBiaCwKKwkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCX0KKworCQkJY3BfbGVuID0gdmFsdWVfbGVuID4gYmxvY2tzaXplID8gYmxvY2tzaXplIDogdmFsdWVfbGVuOworCQkJbWVtY3B5KGJoLT5iX2RhdGEsIHZhbHVlLCBjcF9sZW4pOworCQkJdmFsdWVfbGVuIC09IGNwX2xlbjsKKwkJCXZhbHVlICs9IGNwX2xlbjsKKwkJCWlmIChjcF9sZW4gPCBibG9ja3NpemUpCisJCQkJbWVtc2V0KGJoLT5iX2RhdGEgKyBjcF9sZW4sIDAsCisJCQkJICAgICAgIGJsb2Nrc2l6ZSAtIGNwX2xlbik7CisKKwkJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dF9jb21taXQ7CisJCQl9CisJCQlicmVsc2UoYmgpOworCQkJYmggPSBOVUxMOworCisJCQkvKgorCQkJICogWFhYOiBkbyB3ZSBuZWVkIHRvIGVtcHR5IGFsbCB0aGUgZm9sbG93aW5nCisJCQkgKiBibG9ja3MgaW4gdGhpcyBjbHVzdGVyPworCQkJICovCisJCQlpZiAoIXZhbHVlX2xlbikKKwkJCQlicmVhazsKKwkJfQorCQljcG9zICs9IG51bV9jbHVzdGVyczsKKwl9CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CitvdXQ6CisJYnJlbHNlKGJoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfY2xlYW51cChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCSAgICAgICBzaXplX3Qgb2ZmcykKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4oeGktPm5hbWUpOworCXZvaWQgKnZhbCA9IHhzLT5iYXNlICsgb2ZmczsKKwlzaXplX3Qgc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsgT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksCisJCQkJICAgT0NGUzJfWEFUVFJfQkxPQ0tfVVBEQVRFX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT54YXR0cl9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisJLyogRGVjcmVhc2UgeGF0dHIgY291bnQgKi8KKwlsZTE2X2FkZF9jcHUoJnhzLT5oZWFkZXItPnhoX2NvdW50LCAtMSk7CisJLyogUmVtb3ZlIHRoZSB4YXR0ciBlbnRyeSBhbmQgdHJlZSByb290IHdoaWNoIGhhcyBhbHJlYWR5IGJlIHNldCovCisJbWVtc2V0KCh2b2lkICopeHMtPmhlcmUsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKKwltZW1zZXQodmFsLCAwLCBzaXplKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+eGF0dHJfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl91cGRhdGVfZW50cnkoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkgICAgc2l6ZV90IG9mZnMpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwKKwkJCQkgICBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPnhhdHRyX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KG9mZnMpOworCXhzLT5oZXJlLT54ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlNjQoeGktPnZhbHVlX2xlbik7CisJaWYgKHhpLT52YWx1ZV9sZW4gPD0gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpCisJCW9jZnMyX3hhdHRyX3NldF9sb2NhbCh4cy0+aGVyZSwgMSk7CisJZWxzZQorCQlvY2ZzMl94YXR0cl9zZXRfbG9jYWwoeHMtPmhlcmUsIDApOworCW9jZnMyX3hhdHRyX2hhc2hfZW50cnkoaW5vZGUsIHhzLT5oZWFkZXIsIHhzLT5oZXJlKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+eGF0dHJfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG9jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKCkKKyAqCisgKiBTZXQgbGFyZ2Ugc2l6ZSB2YWx1ZSBpbiBCIHRyZWUuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCQkgc2l6ZV90IG9mZnMpCit7CisJc2l6ZV90IG5hbWVfbGVuID0gc3RybGVuKHhpLT5uYW1lKTsKKwl2b2lkICp2YWwgPSB4cy0+YmFzZSArIG9mZnM7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2ID0gTlVMTDsKKwlzaXplX3Qgc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsgT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCWludCByZXQgPSAwOworCisJbWVtc2V0KHZhbCwgMCwgc2l6ZSk7CisJbWVtY3B5KHZhbCwgeGktPm5hbWUsIG5hbWVfbGVuKTsKKwl4diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQorCQkodmFsICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikpOworCXh2LT54cl9jbHVzdGVycyA9IDA7CisJeHYtPnhyX2xhc3RfZWJfYmxrID0gMDsKKwl4di0+eHJfbGlzdC5sX3RyZWVfZGVwdGggPSAwOworCXh2LT54cl9saXN0LmxfY291bnQgPSBjcHVfdG9fbGUxNigxKTsKKwl4di0+eHJfbGlzdC5sX25leHRfZnJlZV9yZWMgPSAwOworCisJcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIHhzLT54YXR0cl9iaCwgeHYsCisJCQkJCSB4aS0+dmFsdWVfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IF9fb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHh2LCB4aS0+dmFsdWUsCisJCQkJCSAgICAgIHhpLT52YWx1ZV9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gb2NmczJfeGF0dHJfdXBkYXRlX2VudHJ5KGlub2RlLCB4aSwgeHMsIG9mZnMpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogb2NmczJfeGF0dHJfc2V0X2VudHJ5X2xvY2FsKCkKKyAqCisgKiBTZXQsIHJlcGxhY2Ugb3IgcmVtb3ZlIGV4dGVuZGVkIGF0dHJpYnV0ZSBpbiBsb2NhbC4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfc2V0X2VudHJ5X2xvY2FsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqbGFzdCwKKwkJCQkJc2l6ZV90IG1pbl9vZmZzKQoreworCXNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CisJaW50IGk7CisKKwlpZiAoeGktPnZhbHVlICYmIHhzLT5ub3RfZm91bmQpIHsKKwkJLyogSW5zZXJ0IHRoZSBuZXcgeGF0dHIgZW50cnkuICovCisJCWxlMTZfYWRkX2NwdSgmeHMtPmhlYWRlci0+eGhfY291bnQsIDEpOworCQlvY2ZzMl94YXR0cl9zZXRfdHlwZShsYXN0LCB4aS0+bmFtZV9pbmRleCk7CisJCW9jZnMyX3hhdHRyX3NldF9sb2NhbChsYXN0LCAxKTsKKwkJbGFzdC0+eGVfbmFtZV9sZW4gPSBuYW1lX2xlbjsKKwl9IGVsc2UgeworCQl2b2lkICpmaXJzdF92YWw7CisJCXZvaWQgKnZhbDsKKwkJc2l6ZV90IG9mZnMsIHNpemU7CisKKwkJZmlyc3RfdmFsID0geHMtPmJhc2UgKyBtaW5fb2ZmczsKKwkJb2ZmcyA9IGxlMTZfdG9fY3B1KHhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCk7CisJCXZhbCA9IHhzLT5iYXNlICsgb2ZmczsKKworCQlpZiAobGU2NF90b19jcHUoeHMtPmhlcmUtPnhlX3ZhbHVlX3NpemUpID4KKwkJICAgIE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKQorCQkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCQlPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisJCWVsc2UKKwkJCXNpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArCisJCQlPQ0ZTMl9YQVRUUl9TSVpFKGxlNjRfdG9fY3B1KHhzLT5oZXJlLT54ZV92YWx1ZV9zaXplKSk7CisKKwkJaWYgKHhpLT52YWx1ZSAmJiBzaXplID09IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCQlPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pKSB7CisJCQkvKiBUaGUgb2xkIGFuZCB0aGUgbmV3IHZhbHVlIGhhdmUgdGhlCisJCQkgICBzYW1lIHNpemUuIEp1c3QgcmVwbGFjZSB0aGUgdmFsdWUuICovCisJCQlvY2ZzMl94YXR0cl9zZXRfbG9jYWwoeHMtPmhlcmUsIDEpOworCQkJeHMtPmhlcmUtPnhlX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGU2NCh4aS0+dmFsdWVfbGVuKTsKKwkJCS8qIENsZWFyIHZhbHVlIGJ5dGVzLiAqLworCQkJbWVtc2V0KHZhbCArIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pLAorCQkJICAgICAgIDAsCisJCQkgICAgICAgT0NGUzJfWEFUVFJfU0laRSh4aS0+dmFsdWVfbGVuKSk7CisJCQltZW1jcHkodmFsICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbiksCisJCQkgICAgICAgeGktPnZhbHVlLAorCQkJICAgICAgIHhpLT52YWx1ZV9sZW4pOworCQkJcmV0dXJuOworCQl9CisJCS8qIFJlbW92ZSB0aGUgb2xkIG5hbWUrdmFsdWUuICovCisJCW1lbW1vdmUoZmlyc3RfdmFsICsgc2l6ZSwgZmlyc3RfdmFsLCB2YWwgLSBmaXJzdF92YWwpOworCQltZW1zZXQoZmlyc3RfdmFsLCAwLCBzaXplKTsKKwkJeHMtPmhlcmUtPnhlX25hbWVfaGFzaCA9IDA7CisJCXhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCA9IDA7CisJCW9jZnMyX3hhdHRyX3NldF9sb2NhbCh4cy0+aGVyZSwgMSk7CisJCXhzLT5oZXJlLT54ZV92YWx1ZV9zaXplID0gMDsKKworCQltaW5fb2ZmcyArPSBzaXplOworCisJCS8qIEFkanVzdCBhbGwgdmFsdWUgb2Zmc2V0cy4gKi8KKwkJbGFzdCA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CisJCWZvciAoaSA9IDAgOyBpIDwgbGUxNl90b19jcHUoeHMtPmhlYWRlci0+eGhfY291bnQpOyBpKyspIHsKKwkJCXNpemVfdCBvID0gbGUxNl90b19jcHUobGFzdC0+eGVfbmFtZV9vZmZzZXQpOworCisJCQlpZiAobyA8IG9mZnMpCisJCQkJbGFzdC0+eGVfbmFtZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihvICsgc2l6ZSk7CisJCQlsYXN0ICs9IDE7CisJCX0KKworCQlpZiAoIXhpLT52YWx1ZSkgeworCQkJLyogUmVtb3ZlIHRoZSBvbGQgZW50cnkuICovCisJCQlsYXN0IC09IDE7CisJCQltZW1tb3ZlKHhzLT5oZXJlLCB4cy0+aGVyZSArIDEsCisJCQkJKHZvaWQgKilsYXN0IC0gKHZvaWQgKil4cy0+aGVyZSk7CisJCQltZW1zZXQobGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkpOworCQkJbGUxNl9hZGRfY3B1KCZ4cy0+aGVhZGVyLT54aF9jb3VudCwgLTEpOworCQl9CisJfQorCWlmICh4aS0+dmFsdWUpIHsKKwkJLyogSW5zZXJ0IHRoZSBuZXcgbmFtZSt2YWx1ZS4gKi8KKwkJc2l6ZV90IHNpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArCisJCQkJT0NGUzJfWEFUVFJfU0laRSh4aS0+dmFsdWVfbGVuKTsKKwkJdm9pZCAqdmFsID0geHMtPmJhc2UgKyBtaW5fb2ZmcyAtIHNpemU7CisKKwkJeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0ID0gY3B1X3RvX2xlMTYobWluX29mZnMgLSBzaXplKTsKKwkJbWVtc2V0KHZhbCwgMCwgc2l6ZSk7CisJCW1lbWNweSh2YWwsIHhpLT5uYW1lLCBuYW1lX2xlbik7CisJCW1lbWNweSh2YWwgKyBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSwKKwkJICAgICAgIHhpLT52YWx1ZSwKKwkJICAgICAgIHhpLT52YWx1ZV9sZW4pOworCQl4cy0+aGVyZS0+eGVfdmFsdWVfc2l6ZSA9IGNwdV90b19sZTY0KHhpLT52YWx1ZV9sZW4pOworCQlvY2ZzMl94YXR0cl9zZXRfbG9jYWwoeHMtPmhlcmUsIDEpOworCQlvY2ZzMl94YXR0cl9oYXNoX2VudHJ5KGlub2RlLCB4cy0+aGVhZGVyLCB4cy0+aGVyZSk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogb2NmczJfeGF0dHJfc2V0X2VudHJ5KCkKKyAqCisgKiBTZXQgZXh0ZW5kZWQgYXR0cmlidXRlIGVudHJ5IGludG8gaW5vZGUgb3IgYmxvY2suCisgKgorICogSWYgZXh0ZW5kZWQgYXR0cmlidXRlIHZhbHVlIHNpemUgPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSwKKyAqIFdlIGZpcnN0IGluc2VydCB0cmVlIHJvb3Qob2NmczJfeGF0dHJfdmFsdWVfcm9vdCkgd2l0aCBzZXRfZW50cnlfbG9jYWwoKSwKKyAqIHRoZW4gc2V0IHZhbHVlIGluIEIgdHJlZSB3aXRoIHNldF92YWx1ZV9vdXRzaWRlKCkuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJIGludCBmbGFnKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqbGFzdDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopeHMtPmlub2RlX2JoLT5iX2RhdGE7CisJc2l6ZV90IG1pbl9vZmZzID0geHMtPmVuZCAtIHhzLT5iYXNlLCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CisJc2l6ZV90IHNpemVfbCA9IDA7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaW50IGZyZWUsIGksIHJldDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyB4aV9sID0geworCQkubmFtZV9pbmRleCA9IHhpLT5uYW1lX2luZGV4LAorCQkubmFtZSA9IHhpLT5uYW1lLAorCQkudmFsdWUgPSB4aS0+dmFsdWUsCisJCS52YWx1ZV9sZW4gPSB4aS0+dmFsdWVfbGVuLAorCX07CisKKwkvKiBDb21wdXRlIG1pbl9vZmZzLCBsYXN0IGFuZCBmcmVlIHNwYWNlLiAqLworCWxhc3QgPSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOworCisJZm9yIChpID0gMCA7IGkgPCBsZTE2X3RvX2NwdSh4cy0+aGVhZGVyLT54aF9jb3VudCk7IGkrKykgeworCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGxhc3QtPnhlX25hbWVfb2Zmc2V0KTsKKwkJaWYgKG9mZnMgPCBtaW5fb2ZmcykKKwkJCW1pbl9vZmZzID0gb2ZmczsKKwkJbGFzdCArPSAxOworCX0KKworCWZyZWUgPSBtaW5fb2ZmcyAtICgodm9pZCAqKWxhc3QgLSB4cy0+YmFzZSkgLSBzaXplb2YoX191MzIpOworCWlmIChmcmVlIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXhzLT5ub3RfZm91bmQpIHsKKwkJc2l6ZV90IHNpemUgPSAwOworCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeHMtPmhlcmUpKQorCQkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCU9DRlMyX1hBVFRSX1NJWkUobGU2NF90b19jcHUoeHMtPmhlcmUtPnhlX3ZhbHVlX3NpemUpKTsKKwkJZWxzZQorCQkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCQlPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisJCWZyZWUgKz0gKHNpemUgKyBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSk7CisJfQorCS8qIENoZWNrIGZyZWUgc3BhY2UgaW4gaW5vZGUgb3IgYmxvY2sgKi8KKwlpZiAoeGktPnZhbHVlICYmIHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkgeworCQlpZiAoZnJlZSA8IHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpICsKKwkJCSAgIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCSAgIE9DRlMyX1hBVFRSX1JPT1RfU0laRSkgeworCQkJcmV0ID0gLUVOT1NQQzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNpemVfbCA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsgT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCQl4aV9sLnZhbHVlID0gKHZvaWQgKikmZGVmX3h2OworCQl4aV9sLnZhbHVlX2xlbiA9IE9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwl9IGVsc2UgaWYgKHhpLT52YWx1ZSkgeworCQlpZiAoZnJlZSA8IHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpICsKKwkJCSAgIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCSAgIE9DRlMyX1hBVFRSX1NJWkUoeGktPnZhbHVlX2xlbikpIHsKKwkJCXJldCA9IC1FTk9TUEM7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICgheHMtPm5vdF9mb3VuZCkgeworCQkvKiBGb3IgZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlICovCisJCXNpemVfdCBzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKworCQkJT0NGUzJfWEFUVFJfU0laRShsZTY0X3RvX2NwdSh4cy0+aGVyZS0+eGVfdmFsdWVfc2l6ZSkpOworCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KHhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCk7CisJCXZvaWQgKnZhbCA9IHhzLT5iYXNlICsgb2ZmczsKKworCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeHMtPmhlcmUpICYmIHNpemUgPT0gc2l6ZV9sKSB7CisJCQkvKiBSZXBsYWNlIGV4aXN0aW5nIGxvY2FsIHhhdHRyIHdpdGggdHJlZSByb290ICovCisJCQlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgeGksIHhzLAorCQkJCQkJCSAgICBvZmZzKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKCFvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkpIHsKKwkJCS8qIEZvciBleGlzdGluZyB4YXR0ciB3aGljaCBoYXMgdmFsdWUgb3V0c2lkZSAqLworCQkJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2ID0gTlVMTDsKKwkJCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopKHZhbCArCisJCQkJT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikpOworCisJCQlpZiAoeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCQkJLyoKKwkJCQkgKiBJZiBuZXcgdmFsdWUgbmVlZCBzZXQgb3V0c2lkZSBhbHNvLAorCQkJCSAqIGZpcnN0IHRydW5jYXRlIG9sZCB2YWx1ZSB0byBuZXcgdmFsdWUsCisJCQkJICogdGhlbiBzZXQgbmV3IHZhbHVlIHdpdGggc2V0X3ZhbHVlX291dHNpZGUoKS4KKwkJCQkgKi8KKwkJCQlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShpbm9kZSwKKwkJCQkJCQkJIHhzLT54YXR0cl9iaCwKKwkJCQkJCQkJIHh2LAorCQkJCQkJCQkgeGktPnZhbHVlX2xlbik7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlyZXQgPSBfX29jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLAorCQkJCQkJCQl4diwKKwkJCQkJCQkJeGktPnZhbHVlLAorCQkJCQkJCQl4aS0+dmFsdWVfbGVuKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCXJldCA9IG9jZnMyX3hhdHRyX3VwZGF0ZV9lbnRyeShpbm9kZSwKKwkJCQkJCQkgICAgICAgeGksCisJCQkJCQkJICAgICAgIHhzLAorCQkJCQkJCSAgICAgICBvZmZzKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIElmIG5ldyB2YWx1ZSBuZWVkIHNldCBpbiBsb2NhbCwKKwkJCQkgKiBqdXN0IHRydWNhdGUgb2xkIHZhbHVlIHRvIHplcm8uCisJCQkJICovCisJCQkJIHJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLAorCQkJCQkJCQkgeHMtPnhhdHRyX2JoLAorCQkJCQkJCQkgeHYsCisJCQkJCQkJCSAwKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJfQorCQl9CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksCisJCQkJICAgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPmlub2RlX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCWlmICghKGZsYWcgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpKSB7CisJCS8qIHNldCBleHRlbmRlZCBhdHRyaWJ1dGUgaW4gZXh0ZXJuYWwgYmxvY2suICovCisJCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsCisJCQkJCSBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyArCisJCQkJCSBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+eGF0dHJfYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisJfQorCisJLyoKKwkgKiBTZXQgdmFsdWUgaW4gbG9jYWwsIGluY2x1ZGUgc2V0IHRyZWUgcm9vdCBpbiBsb2NhbC4KKwkgKiBUaGlzIGlzIHRoZSBmaXJzdCBzdGVwIGZvciB2YWx1ZSBzaXplID5JTkxJTkVfU0laRS4KKwkgKi8KKwlvY2ZzMl94YXR0cl9zZXRfZW50cnlfbG9jYWwoaW5vZGUsICZ4aV9sLCB4cywgbGFzdCwgbWluX29mZnMpOworCisJaWYgKCEoZmxhZyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpIHsKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT54YXR0cl9iaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9jb21taXQ7CisJCX0KKwl9CisKKwlpZiAoIShvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKSAmJgorCSAgICAoZmxhZyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpIHsKKwkJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJCXVuc2lnbmVkIGludCB4YXR0cnNpemUgPSBvc2ItPnNfeGF0dHJfaW5saW5lX3NpemU7CisKKwkJLyoKKwkJICogQWRqdXN0IGV4dGVudCByZWNvcmQgY291bnQgb3IgaW5saW5lIGRhdGEgc2l6ZQorCQkgKiB0byByZXNlcnZlIHNwYWNlIGZvciBleHRlbmRlZCBhdHRyaWJ1dGUuCisJCSAqLworCQlpZiAob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKSB7CisJCQlzdHJ1Y3Qgb2NmczJfaW5saW5lX2RhdGEgKmlkYXRhID0gJmRpLT5pZDIuaV9kYXRhOworCQkJbGUxNl9hZGRfY3B1KCZpZGF0YS0+aWRfY291bnQsIC14YXR0cnNpemUpOworCQl9IGVsc2UgaWYgKCEob2NmczJfaW5vZGVfaXNfZmFzdF9zeW1saW5rKGlub2RlKSkpIHsKKwkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmZGktPmlkMi5pX2xpc3Q7CisJCQlsZTE2X2FkZF9jcHUoJmVsLT5sX2NvdW50LCAtKHhhdHRyc2l6ZSAvCisJCQkJCXNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpKTsKKwkJfQorCQlkaS0+aV94YXR0cl9pbmxpbmVfc2l6ZSA9IGNwdV90b19sZTE2KHhhdHRyc2l6ZSk7CisJfQorCS8qIFVwZGF0ZSB4YXR0ciBmbGFnICovCisJc3Bpbl9sb2NrKCZvaS0+aXBfbG9jayk7CisJb2ktPmlwX2R5bl9mZWF0dXJlcyB8PSBmbGFnOworCWRpLT5pX2R5bl9mZWF0dXJlcyA9IGNwdV90b19sZTE2KG9pLT5pcF9keW5fZmVhdHVyZXMpOworCXNwaW5fdW5sb2NrKCZvaS0+aXBfbG9jayk7CisJLyogVXBkYXRlIGlub2RlIGN0aW1lICovCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJZGktPmlfY3RpbWUgPSBjcHVfdG9fbGU2NChpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCWRpLT5pX2N0aW1lX25zZWMgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9jdGltZS50dl9uc2VjKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+aW5vZGVfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKKworCWlmICghcmV0ICYmIHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkgeworCQkvKgorCQkgKiBTZXQgdmFsdWUgb3V0c2lkZSBpbiBCIHRyZWUuCisJCSAqIFRoaXMgaXMgdGhlIHNlY29uZCBzdGVwIGZvciB2YWx1ZSBzaXplID4gSU5MSU5FX1NJWkUuCisJCSAqLworCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KHhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCk7CisJCXJldCA9IG9jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4aSwgeHMsIG9mZnMpOworCQlpZiAocmV0IDwgMCkgeworCQkJaW50IHJldDI7CisKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCS8qCisJCQkgKiBJZiBzZXQgdmFsdWUgb3V0c2lkZSBmYWlsZWQsIHdlIGhhdmUgdG8gY2xlYW4KKwkJCSAqIHRoZSBqdW5rIHRyZWUgcm9vdCB3ZSBoYXZlIGFscmVhZHkgc2V0IGluIGxvY2FsLgorCQkJICovCisJCQlyZXQyID0gb2NmczJfeGF0dHJfY2xlYW51cChpbm9kZSwgeGksIHhzLCBvZmZzKTsKKwkJCWlmIChyZXQyIDwgMCkKKwkJCQltbG9nX2Vycm5vKHJldDIpOworCQl9CisJfQorb3V0OgorCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCBvY2ZzMl9yZW1vdmVfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUqaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXIpCit7CisJaW50IHJldCA9IDAsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoaGVhZGVyLT54aF9jb3VudCk7IGkrKykgeworCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmVudHJ5ID0gJmhlYWRlci0+eGhfZW50cmllc1tpXTsKKworCQlpZiAoIW9jZnMyX3hhdHRyX2lzX2xvY2FsKGVudHJ5KSkgeworCQkJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2OworCQkJdm9pZCAqdmFsOworCisJCQl2YWwgPSAodm9pZCAqKWhlYWRlciArCisJCQkJbGUxNl90b19jcHUoZW50cnktPnhlX25hbWVfb2Zmc2V0KTsKKwkJCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopCisJCQkJKHZhbCArIE9DRlMyX1hBVFRSX1NJWkUoZW50cnktPnhlX25hbWVfbGVuKSk7CisJCQlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShpbm9kZSwgYmgsIHh2LCAwKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2lib2R5X3JlbW92ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoKQoreworCisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyOworCWludCByZXQ7CisKKwloZWFkZXIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKQorCQkgKCh2b2lkICopZGkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkgbGUxNl90b19jcHUoZGktPmlfeGF0dHJfaW5saW5lX3NpemUpKTsKKworCXJldCA9IG9jZnMyX3JlbW92ZV92YWx1ZV9vdXRzaWRlKGlub2RlLCBkaV9iaCwgaGVhZGVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYmxvY2tfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmxrX2JoKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGI7CisJaW50IHJldCA9IDA7CisKKwl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilibGtfYmgtPmJfZGF0YTsKKwlpZiAoIShsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyID0gJih4Yi0+eGJfYXR0cnMueGJfaGVhZGVyKTsKKwkJcmV0ID0gb2NmczJfcmVtb3ZlX3ZhbHVlX291dHNpZGUoaW5vZGUsIGJsa19iaCwgaGVhZGVyKTsKKwl9IGVsc2UKKwkJcmV0ID0gb2NmczJfZGVsZXRlX3hhdHRyX2luZGV4X2Jsb2NrKGlub2RlLCBibGtfYmgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9mcmVlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICB1NjQgYmxvY2spCit7CisJc3RydWN0IGlub2RlICp4Yl9hbGxvY19pbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiX2FsbG9jX2JoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJsa19iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YjsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQgPSAwOworCXU2NCBibGssIGJnX2Jsa25vOworCXUxNiBiaXQ7CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibG9jaywgJmJsa19iaCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKlZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mIHhhdHRyIGJsb2NrKi8KKwlpZiAobWVtY21wKCh2b2lkICopYmxrX2JoLT5iX2RhdGEsIE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRSwKKwkJICAgc3RybGVuKE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRSkpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3JlbW92ZShpbm9kZSwgYmxrX2JoKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOworCWJsayA9IGxlNjRfdG9fY3B1KHhiLT54Yl9ibGtubyk7CisJYml0ID0gbGUxNl90b19jcHUoeGItPnhiX3N1YmFsbG9jX2JpdCk7CisJYmdfYmxrbm8gPSBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cChibGssIGJpdCk7CisKKwl4Yl9hbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCisJCQkJRVhURU5UX0FMTE9DX1NZU1RFTV9JTk9ERSwKKwkJCQlsZTE2X3RvX2NwdSh4Yi0+eGJfc3ViYWxsb2Nfc2xvdCkpOworCWlmICgheGJfYWxsb2NfaW5vZGUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJbXV0ZXhfbG9jaygmeGJfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0ID0gb2NmczJfaW5vZGVfbG9jayh4Yl9hbGxvY19pbm9kZSwgJnhiX2FsbG9jX2JoLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X211dGV4OworCX0KKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfU1VCQUxMT0NfRlJFRSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJcmV0ID0gb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZSwgeGJfYWxsb2NfaW5vZGUsIHhiX2FsbG9jX2JoLAorCQkJCSAgICAgICBiaXQsIGJnX2Jsa25vLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dF91bmxvY2s6CisJb2NmczJfaW5vZGVfdW5sb2NrKHhiX2FsbG9jX2lub2RlLCAxKTsKKwlicmVsc2UoeGJfYWxsb2NfYmgpOworb3V0X211dGV4OgorCW11dGV4X3VubG9jaygmeGJfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOworCWlwdXQoeGJfYWxsb2NfaW5vZGUpOworb3V0OgorCWJyZWxzZShibGtfYmgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBvY2ZzMl94YXR0cl9yZW1vdmUoKQorICoKKyAqIEZyZWUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbm9kZS4KKyAqLworaW50IG9jZnMyX3hhdHRyX3JlbW92ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoKQoreworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IHJldDsKKworCWlmICghb2NmczJfc3VwcG9ydHNfeGF0dHIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSEFTX1hBVFRSX0ZMKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkgeworCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9yZW1vdmUoaW5vZGUsIGRpX2JoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGRpLT5pX3hhdHRyX2xvYykgeworCQlyZXQgPSBvY2ZzMl94YXR0cl9mcmVlX2Jsb2NrKGlub2RlLAorCQkJCQkgICAgIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYykpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwKKwkJCQkgICBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJZGktPmlfeGF0dHJfbG9jID0gMDsKKworCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOworCW9pLT5pcF9keW5fZmVhdHVyZXMgJj0gfihPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwgfCBPQ0ZTMl9IQVNfWEFUVFJfRkwpOworCWRpLT5pX2R5bl9mZWF0dXJlcyA9IGNwdV90b19sZTE2KG9pLT5pcF9keW5fZmVhdHVyZXMpOworCXNwaW5fdW5sb2NrKCZvaS0+aXBfbG9jayk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9oYXNfc3BhY2VfaW5saW5lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpKQoreworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXVuc2lnbmVkIGludCB4YXR0cnNpemUgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfeGF0dHJfaW5saW5lX3NpemU7CisJaW50IGZyZWU7CisKKwlpZiAoeGF0dHJzaXplIDwgT0NGUzJfTUlOX1hBVFRSX0lOTElORV9TSVpFKQorCQlyZXR1cm4gMDsKKworCWlmIChvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX0RBVEFfRkwpIHsKKwkJc3RydWN0IG9jZnMyX2lubGluZV9kYXRhICppZGF0YSA9ICZkaS0+aWQyLmlfZGF0YTsKKwkJZnJlZSA9IGxlMTZfdG9fY3B1KGlkYXRhLT5pZF9jb3VudCkgLSBsZTY0X3RvX2NwdShkaS0+aV9zaXplKTsKKwl9IGVsc2UgaWYgKG9jZnMyX2lub2RlX2lzX2Zhc3Rfc3ltbGluayhpbm9kZSkpIHsKKwkJZnJlZSA9IG9jZnMyX2Zhc3Rfc3ltbGlua19jaGFycyhpbm9kZS0+aV9zYikgLQorCQkJbGU2NF90b19jcHUoZGktPmlfc2l6ZSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZkaS0+aWQyLmlfbGlzdDsKKwkJZnJlZSA9IChsZTE2X3RvX2NwdShlbC0+bF9jb3VudCkgLQorCQkJbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpICoKKwkJCXNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyk7CisJfQorCWlmIChmcmVlID49IHhhdHRyc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG9jZnMyX3hhdHRyX2lib2R5X2ZpbmQoKQorICoKKyAqIEZpbmQgZXh0ZW5kZWQgYXR0cmlidXRlIGluIGlub2RlIGJsb2NrIGFuZAorICogZmlsbCBzZWFyY2ggaW5mbyBpbnRvIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2guCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfaWJvZHlfZmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgaW50IG5hbWVfaW5kZXgsCisJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXhzLT5pbm9kZV9iaC0+Yl9kYXRhOworCWludCByZXQ7CisJaW50IGhhc19zcGFjZSA9IDA7CisKKwlpZiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID09IE9DRlMyX01JTl9CTE9DS1NJWkUpCisJCXJldHVybiAwOworCisJaWYgKCEob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpIHsKKwkJZG93bl9yZWFkKCZvaS0+aXBfYWxsb2Nfc2VtKTsKKwkJaGFzX3NwYWNlID0gb2NmczJfeGF0dHJfaGFzX3NwYWNlX2lubGluZShpbm9kZSwgZGkpOworCQl1cF9yZWFkKCZvaS0+aXBfYWxsb2Nfc2VtKTsKKwkJaWYgKCFoYXNfc3BhY2UpCisJCQlyZXR1cm4gMDsKKwl9CisKKwl4cy0+eGF0dHJfYmggPSB4cy0+aW5vZGVfYmg7CisJeHMtPmVuZCA9ICh2b2lkICopZGkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaWYgKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpCisJCXhzLT5oZWFkZXIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKQorCQkJKHhzLT5lbmQgLSBsZTE2X3RvX2NwdShkaS0+aV94YXR0cl9pbmxpbmVfc2l6ZSkpOworCWVsc2UKKwkJeHMtPmhlYWRlciA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopCisJCQkoeHMtPmVuZCAtIE9DRlMyX1NCKGlub2RlLT5pX3NiKS0+c194YXR0cl9pbmxpbmVfc2l6ZSk7CisJeHMtPmJhc2UgPSAodm9pZCAqKXhzLT5oZWFkZXI7CisJeHMtPmhlcmUgPSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOworCisJLyogRmluZCB0aGUgbmFtZWQgYXR0cmlidXRlLiAqLworCWlmIChvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKSB7CisJCXJldCA9IG9jZnMyX3hhdHRyX2ZpbmRfZW50cnkobmFtZV9pbmRleCwgbmFtZSwgeHMpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PREFUQSkKKwkJCXJldHVybiByZXQ7CisJCXhzLT5ub3RfZm91bmQgPSByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBvY2ZzMl94YXR0cl9pYm9keV9zZXQoKQorICoKKyAqIFNldCwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gaW5vZGUgYmxvY2suCisgKgorICovCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2lib2R5X3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQoreworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil4cy0+aW5vZGVfYmgtPmJfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA9PSBPQ0ZTMl9NSU5fQkxPQ0tTSVpFKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWRvd25fd3JpdGUoJm9pLT5pcF9hbGxvY19zZW0pOworCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpKSB7CisJCWlmICghb2NmczJfeGF0dHJfaGFzX3NwYWNlX2lubGluZShpbm9kZSwgZGkpKSB7CisJCQlyZXQgPSAtRU5PU1BDOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnkoaW5vZGUsIHhpLCB4cywKKwkJCQkoT0NGUzJfSU5MSU5FX1hBVFRSX0ZMIHwgT0NGUzJfSEFTX1hBVFRSX0ZMKSk7CitvdXQ6CisJdXBfd3JpdGUoJm9pLT5pcF9hbGxvY19zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG9jZnMyX3hhdHRyX2Jsb2NrX2ZpbmQoKQorICoKKyAqIEZpbmQgZXh0ZW5kZWQgYXR0cmlidXRlIGluIGV4dGVybmFsIGJsb2NrIGFuZAorICogZmlsbCBzZWFyY2ggaW5mbyBpbnRvIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2guCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYmxvY2tfZmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgaW50IG5hbWVfaW5kZXgsCisJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXhzLT5pbm9kZV9iaC0+Yl9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxrX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiOworCWludCByZXQgPSAwOworCisJaWYgKCFkaS0+aV94YXR0cl9sb2MpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsZTY0X3RvX2NwdShkaS0+aV94YXR0cl9sb2MpLCAmYmxrX2JoKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCS8qVmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgeGF0dHIgYmxvY2sqLworCWlmIChtZW1jbXAoKHZvaWQgKilibGtfYmgtPmJfZGF0YSwgT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFLAorCQkgICBzdHJsZW4oT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJeHMtPnhhdHRyX2JoID0gYmxrX2JoOworCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOworCisJaWYgKCEobGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKSAmIE9DRlMyX1hBVFRSX0lOREVYRUQpKSB7CisJCXhzLT5oZWFkZXIgPSAmeGItPnhiX2F0dHJzLnhiX2hlYWRlcjsKKwkJeHMtPmJhc2UgPSAodm9pZCAqKXhzLT5oZWFkZXI7CisJCXhzLT5lbmQgPSAodm9pZCAqKShibGtfYmgtPmJfZGF0YSkgKyBibGtfYmgtPmJfc2l6ZTsKKwkJeHMtPmhlcmUgPSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOworCisJCXJldCA9IG9jZnMyX3hhdHRyX2ZpbmRfZW50cnkobmFtZV9pbmRleCwgbmFtZSwgeHMpOworCX0gZWxzZQorCQlyZXQgPSBvY2ZzMl94YXR0cl9pbmRleF9ibG9ja19maW5kKGlub2RlLCBibGtfYmgsCisJCQkJCQkgICBuYW1lX2luZGV4LAorCQkJCQkJICAgbmFtZSwgeHMpOworCisJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RBVEEpIHsKKwkJeHMtPnhhdHRyX2JoID0gTlVMTDsKKwkJZ290byBjbGVhbnVwOworCX0KKwl4cy0+bm90X2ZvdW5kID0gcmV0OworCXJldHVybiAwOworY2xlYW51cDoKKwlicmVsc2UoYmxrX2JoKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXaGVuIGFsbCB0aGUgeGF0dHJzIGFyZSBkZWxldGVkIGZyb20gaW5kZXggYnRyZWUsIHRoZSBvY2ZzMl94YXR0cl90cmVlCisgKiB3aWxsIGJlIGVyYXNlZCBhbmQgb2NmczJfeGF0dHJfYmxvY2sgd2lsbCBoYXZlIGl0cyBvY2ZzMl94YXR0cl9oZWFkZXIKKyAqIHJlLWluaXRpYWxpemVkLgorICovCitzdGF0aWMgaW50IG9jZnMyX3Jlc3RvcmVfeGF0dHJfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQoreworCWludCByZXQ7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0KKwkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhzLT54YXR0cl9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmeGItPnhiX2F0dHJzLnhiX3Jvb3QueHRfbGlzdDsKKwl1MTYgeGJfZmxhZ3MgPSBsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpOworCisJQlVHX09OKCEoeGJfZmxhZ3MgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSB8fAorCQlsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAhPSAwKTsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfWEFUVFJfQkxPQ0tfVVBEQVRFX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWhhbmRsZSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT54YXR0cl9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJbWVtc2V0KCZ4Yi0+eGJfYXR0cnMsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJICAgICAgIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywgeGJfYXR0cnMpKTsKKworCXhiLT54Yl9mbGFncyA9IGNwdV90b19sZTE2KHhiX2ZsYWdzICYgfk9DRlMyX1hBVFRSX0lOREVYRUQpOworCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT54YXR0cl9iaCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogb2NmczJfeGF0dHJfYmxvY2tfc2V0KCkKKyAqCisgKiBTZXQsIHJlcGxhY2Ugb3IgcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBpbnRvIGV4dGVybmFsIGJsb2NrLgorICoKKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9ibG9ja19zZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAgKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil4cy0+aW5vZGVfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YmxrID0gTlVMTDsKKwl1MTYgc3ViYWxsb2NfYml0X3N0YXJ0OworCXUzMiBudW1fZ290OworCXU2NCBmaXJzdF9ibGtubzsKKwlpbnQgcmV0OworCisJaWYgKCF4cy0+eGF0dHJfYmgpIHsKKwkJLyoKKwkJICogQWxsb2Mgb25lIGV4dGVybmFsIGJsb2NrIGZvciBleHRlbmRlZCBhdHRyaWJ1dGUKKwkJICogb3V0c2lkZSBvZiBpbm9kZS4KKwkJICovCisJCXJldCA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhX2Jsb2Nrcyhvc2IsIDEsICZtZXRhX2FjKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwKKwkJCQkJICAgT0NGUzJfWEFUVFJfQkxPQ0tfQ1JFQVRFX0NSRURJVFMpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT5pbm9kZV9iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCisJCXJldCA9IG9jZnMyX2NsYWltX21ldGFkYXRhKG9zYiwgaGFuZGxlLCBtZXRhX2FjLCAxLAorCQkJCQkgICAmc3ViYWxsb2NfYml0X3N0YXJ0LCAmbnVtX2dvdCwKKwkJCQkJICAgJmZpcnN0X2Jsa25vKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCisJCW5ld19iaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZmlyc3RfYmxrbm8pOworCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgbmV3X2JoKTsKKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBuZXdfYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9jb21taXQ7CisJCX0KKworCQkvKiBJbml0aWFsaXplIG9jZnMyX3hhdHRyX2Jsb2NrICovCisJCXhzLT54YXR0cl9iaCA9IG5ld19iaDsKKwkJeGJsayA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKiluZXdfYmgtPmJfZGF0YTsKKwkJbWVtc2V0KHhibGssIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCXN0cmNweSgodm9pZCAqKXhibGssIE9DRlMyX1hBVFRSX0JMT0NLX1NJR05BVFVSRSk7CisJCXhibGstPnhiX3N1YmFsbG9jX3Nsb3QgPSBjcHVfdG9fbGUxNihvc2ItPnNsb3RfbnVtKTsKKwkJeGJsay0+eGJfc3ViYWxsb2NfYml0ID0gY3B1X3RvX2xlMTYoc3ViYWxsb2NfYml0X3N0YXJ0KTsKKwkJeGJsay0+eGJfZnNfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKG9zYi0+ZnNfZ2VuZXJhdGlvbik7CisJCXhibGstPnhiX2Jsa25vID0gY3B1X3RvX2xlNjQoZmlyc3RfYmxrbm8pOworCisJCXhzLT5oZWFkZXIgPSAmeGJsay0+eGJfYXR0cnMueGJfaGVhZGVyOworCQl4cy0+YmFzZSA9ICh2b2lkICopeHMtPmhlYWRlcjsKKwkJeHMtPmVuZCA9ICh2b2lkICopeGJsayArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJeHMtPmhlcmUgPSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOworCisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG5ld19iaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9jb21taXQ7CisJCX0KKwkJZGktPmlfeGF0dHJfbG9jID0gY3B1X3RvX2xlNjQoZmlyc3RfYmxrbm8pOworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPmlub2RlX2JoKTsKKwkJaWYgKHJldCA8IDApCisJCQltbG9nX2Vycm5vKHJldCk7CitvdXRfY29tbWl0OgorCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCQlpZiAobWV0YV9hYykKKwkJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZQorCQl4YmxrID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhzLT54YXR0cl9iaC0+Yl9kYXRhOworCisJaWYgKCEobGUxNl90b19jcHUoeGJsay0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKKwkJLyogU2V0IGV4dGVuZGVkIGF0dHJpYnV0ZSBpbnRvIGV4dGVybmFsIGJsb2NrICovCisJCXJldCA9IG9jZnMyX3hhdHRyX3NldF9lbnRyeShpbm9kZSwgeGksIHhzLCBPQ0ZTMl9IQVNfWEFUVFJfRkwpOworCQlpZiAoIXJldCB8fCByZXQgIT0gLUVOT1NQQykKKwkJCWdvdG8gZW5kOworCisJCXJldCA9IG9jZnMyX3hhdHRyX2NyZWF0ZV9pbmRleF9ibG9jayhpbm9kZSwgeHMpOworCQlpZiAocmV0KQorCQkJZ290byBlbmQ7CisJfQorCisJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luZGV4X2Jsb2NrKGlub2RlLCB4aSwgeHMpOworCWlmICghcmV0ICYmIHhibGstPnhiX2F0dHJzLnhiX3Jvb3QueHRfbGlzdC5sX25leHRfZnJlZV9yZWMgPT0gMCkKKwkJcmV0ID0gb2NmczJfcmVzdG9yZV94YXR0cl9ibG9jayhpbm9kZSwgeHMpOworCitlbmQ6CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogb2NmczJfeGF0dHJfc2V0KCkKKyAqCisgKiBTZXQsIHJlcGxhY2Ugb3IgcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmb3IgdGhpcyBpbm9kZS4KKyAqIHZhbHVlIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgZWxzZSBlaXRoZXIKKyAqIGNyZWF0ZSBvciByZXBsYWNlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKyAqLworaW50IG9jZnMyX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgaW50IG5hbWVfaW5kZXgsCisJCSAgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSAgICBzaXplX3QgdmFsdWVfbGVuLAorCQkgICAgaW50IGZsYWdzKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCWludCByZXQ7CisJdTE2IGksIGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCisJc3RydWN0IG9jZnMyX3hhdHRyX2luZm8geGkgPSB7CisJCS5uYW1lX2luZGV4ID0gbmFtZV9pbmRleCwKKwkJLm5hbWUgPSBuYW1lLAorCQkudmFsdWUgPSB2YWx1ZSwKKwkJLnZhbHVlX2xlbiA9IHZhbHVlX2xlbiwKKwl9OworCisJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB4aXMgPSB7CisJCS5ub3RfZm91bmQgPSAtRU5PREFUQSwKKwl9OworCisJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB4YnMgPSB7CisJCS5ub3RfZm91bmQgPSAtRU5PREFUQSwKKwl9OworCisJaWYgKCFvY2ZzMl9zdXBwb3J0c194YXR0cihPQ0ZTMl9TQihpbm9kZS0+aV9zYikpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJeGlzLmlub2RlX2JoID0geGJzLmlub2RlX2JoID0gZGlfYmg7CisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisKKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfeGF0dHJfc2VtKTsKKwkvKgorCSAqIFNjYW4gaW5vZGUgYW5kIGV4dGVybmFsIGJsb2NrIHRvIGZpbmQgdGhlIHNhbWUgbmFtZQorCSAqIGV4dGVuZGVkIGF0dHJpYnV0ZSBhbmQgY29sbGVjdCBzZWFyY2ggaW5mb21hdGlvbi4KKwkgKi8KKwlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9maW5kKGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCAmeGlzKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFudXA7CisJaWYgKHhpcy5ub3RfZm91bmQpIHsKKwkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfZmluZChpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgJnhicyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKHhpcy5ub3RfZm91bmQgJiYgeGJzLm5vdF9mb3VuZCkgeworCQlyZXQgPSAtRU5PREFUQTsKKwkJaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJcmV0ID0gMDsKKwkJaWYgKCF2YWx1ZSkKKwkJCWdvdG8gY2xlYW51cDsKKwl9IGVsc2UgeworCQlyZXQgPSAtRUVYSVNUOworCQlpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpCisJCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKCF2YWx1ZSkgeworCQkvKiBSZW1vdmUgZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlICovCisJCWlmICgheGlzLm5vdF9mb3VuZCkKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X3NldChpbm9kZSwgJnhpLCAmeGlzKTsKKwkJZWxzZSBpZiAoIXhicy5ub3RfZm91bmQpCisJCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19zZXQoaW5vZGUsICZ4aSwgJnhicyk7CisJfSBlbHNlIHsKKwkJLyogV2UgYWx3YXlzIHRyeSB0byBzZXQgZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gaW5vZGUgZmlyc3QqLworCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9zZXQoaW5vZGUsICZ4aSwgJnhpcyk7CisJCWlmICghcmV0ICYmICF4YnMubm90X2ZvdW5kKSB7CisJCQkvKgorCQkJICogSWYgc3VjY2VlZCBhbmQgdGhhdCBleHRlbmRlZCBhdHRyaWJ1dGUgZXhpc3RpbmcgaW4KKwkJCSAqIGV4dGVybmFsIGJsb2NrLCB0aGVuIHdlIHdpbGwgcmVtb3ZlIGl0LgorCQkJICovCisJCQl4aS52YWx1ZSA9IE5VTEw7CisJCQl4aS52YWx1ZV9sZW4gPSAwOworCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfc2V0KGlub2RlLCAmeGksICZ4YnMpOworCQl9IGVsc2UgaWYgKHJldCA9PSAtRU5PU1BDKSB7CisJCQlpZiAoZGktPmlfeGF0dHJfbG9jICYmICF4YnMueGF0dHJfYmgpIHsKKwkJCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19maW5kKGlub2RlLCBuYW1lX2luZGV4LAorCQkJCQkJCSAgICAgbmFtZSwgJnhicyk7CisJCQkJaWYgKHJldCkKKwkJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJLyoKKwkJCSAqIElmIG5vIHNwYWNlIGluIGlub2RlLCB3ZSB3aWxsIHNldCBleHRlbmRlZCBhdHRyaWJ1dGUKKwkJCSAqIGludG8gZXh0ZXJuYWwgYmxvY2suCisJCQkgKi8KKwkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChpbm9kZSwgJnhpLCAmeGJzKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBjbGVhbnVwOworCQkJaWYgKCF4aXMubm90X2ZvdW5kKSB7CisJCQkJLyoKKwkJCQkgKiBJZiBzdWNjZWVkIGFuZCB0aGF0IGV4dGVuZGVkIGF0dHJpYnV0ZQorCQkJCSAqIGV4aXN0aW5nIGluIGlub2RlLCB3ZSB3aWxsIHJlbW92ZSBpdC4KKwkJCQkgKi8KKwkJCQl4aS52YWx1ZSA9IE5VTEw7CisJCQkJeGkudmFsdWVfbGVuID0gMDsKKwkJCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9zZXQoaW5vZGUsICZ4aSwgJnhpcyk7CisJCQl9CisJCX0KKwl9CitjbGVhbnVwOgorCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfeGF0dHJfc2VtKTsKKwlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDEpOworCWJyZWxzZShkaV9iaCk7CisJYnJlbHNlKHhicy54YXR0cl9iaCk7CisJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCisJCWJyZWxzZSh4YnMuYnVja2V0LmJoc1tpXSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRmluZCB0aGUgeGF0dHIgZXh0ZW50IHJlYyB3aGljaCBtYXkgY29udGFpbnMgbmFtZV9oYXNoLgorICogZV9jcG9zIHdpbGwgYmUgdGhlIGZpcnN0IG5hbWUgaGFzaCBvZiB0aGUgeGF0dHIgcmVjLgorICogZWwgbXVzdCBiZSB0aGUgb2NmczJfeGF0dHJfaGVhZGVyLnhiX2F0dHJzLnhiX3Jvb3QueHRfbGlzdC4KKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9nZXRfcmVjKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgdTMyIG5hbWVfaGFzaCwKKwkJCSAgICAgICB1NjQgKnBfYmxrbm8sCisJCQkgICAgICAgdTMyICplX2Nwb3MsCisJCQkgICAgICAgdTMyICpudW1fY2x1c3RlcnMsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjID0gTlVMTDsKKwl1NjQgZV9ibGtubyA9IDA7CisKKwlpZiAoZWwtPmxfdHJlZV9kZXB0aCkgeworCQlyZXQgPSBvY2ZzMl9maW5kX2xlYWYoaW5vZGUsIGVsLCBuYW1lX2hhc2gsICZlYl9iaCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBlYl9iaC0+Yl9kYXRhOworCQllbCA9ICZlYi0+aF9saXN0OworCisJCWlmIChlbC0+bF90cmVlX2RlcHRoKSB7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIklub2RlICVsdSBoYXMgbm9uIHplcm8gdHJlZSBkZXB0aCBpbiAiCisJCQkJICAgICJ4YXR0ciB0cmVlIGJsb2NrICVsbHVcbiIsIGlub2RlLT5pX2lubywKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllYl9iaC0+Yl9ibG9ja25yKTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZm9yIChpID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOyBpID49IDA7IGktLSkgeworCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKKworCQlpZiAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpIDw9IG5hbWVfaGFzaCkgeworCQkJZV9ibGtubyA9IGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZV9ibGtubykgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwgIklub2RlICVsdSBoYXMgYmFkIGV4dGVudCAiCisJCQkgICAgInJlY29yZCAoJXUsICV1LCAwKSBpbiB4YXR0ciIsIGlub2RlLT5pX2lubywKKwkJCSAgICBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksCisJCQkgICAgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwkqcF9ibGtubyA9IGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubyk7CisJKm51bV9jbHVzdGVycyA9IGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKKwlpZiAoZV9jcG9zKQorCQkqZV9jcG9zID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOworb3V0OgorCWJyZWxzZShlYl9iaCk7CisJcmV0dXJuIHJldDsKK30KKwordHlwZWRlZiBpbnQgKHhhdHRyX2J1Y2tldF9mdW5jKShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKKwkJCQl2b2lkICpwYXJhKTsKKworc3RhdGljIGludCBvY2ZzMl9maW5kX3hlX2luX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZGVyX2JoLAorCQkJCSAgIGludCBuYW1lX2luZGV4LAorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgdTMyIG5hbWVfaGFzaCwKKwkJCQkgICB1MTYgKnhlX2luZGV4LAorCQkJCSAgIGludCAqZm91bmQpCit7CisJaW50IGksIHJldCA9IDAsIGNtcCA9IDEsIGJsb2NrX29mZiwgbmV3X29mZnNldDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9CisJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWhlYWRlcl9iaC0+Yl9kYXRhOworCXNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5hbWVfYmggPSBOVUxMOworCWNoYXIgKnhlX25hbWU7CisKKwkvKgorCSAqIFdlIGRvbid0IHVzZSBiaW5hcnkgc2VhcmNoIGluIHRoZSBidWNrZXQgYmVjYXVzZSB0aGVyZQorCSAqIG1heSBiZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbmFtZSBoYXNoLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpOyBpKyspIHsKKwkJeGUgPSAmeGgtPnhoX2VudHJpZXNbaV07CisKKwkJaWYgKG5hbWVfaGFzaCA+IGxlMzJfdG9fY3B1KHhlLT54ZV9uYW1lX2hhc2gpKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKG5hbWVfaGFzaCA8IGxlMzJfdG9fY3B1KHhlLT54ZV9uYW1lX2hhc2gpKQorCQkJYnJlYWs7CisKKwkJY21wID0gbmFtZV9pbmRleCAtIG9jZnMyX3hhdHRyX2dldF90eXBlKHhlKTsKKwkJaWYgKCFjbXApCisJCQljbXAgPSBuYW1lX2xlbiAtIHhlLT54ZV9uYW1lX2xlbjsKKwkJaWYgKGNtcCkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShpbm9kZSwKKwkJCQkJCQl4aCwKKwkJCQkJCQlpLAorCQkJCQkJCSZibG9ja19vZmYsCisJCQkJCQkJJm5ld19vZmZzZXQpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGhlYWRlcl9iaC0+Yl9ibG9ja25yICsgYmxvY2tfb2ZmLAorCQkJCSAgICAgICAmbmFtZV9iaCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWJyZWFrOworCQl9CisJCXhlX25hbWUgPSBuYW1lX2JoLT5iX2RhdGEgKyBuZXdfb2Zmc2V0OworCisJCWNtcCA9IG1lbWNtcChuYW1lLCB4ZV9uYW1lLCBuYW1lX2xlbik7CisJCWJyZWxzZShuYW1lX2JoKTsKKwkJbmFtZV9iaCA9IE5VTEw7CisKKwkJaWYgKGNtcCA9PSAwKSB7CisJCQkqeGVfaW5kZXggPSBpOworCQkJKmZvdW5kID0gMTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBzcGVjaWZpZWQgeGF0dHIgZW50cnkgaW4gYSBzZXJpZXMgb2YgYnVja2V0cy4KKyAqIFRoaXMgc2VyaWVzIHN0YXJ0IGZyb20gcF9ibGtubyBhbmQgbGFzdCBmb3IgbnVtX2NsdXN0ZXJzLgorICogVGhlIG9jZnMyX3hhdHRyX2hlYWRlci54aF9udW1fYnVja2V0cyBvZiB0aGUgZmlyc3QgYnVja2V0IGNvbnRhaW5zCisgKiB0aGUgbnVtIG9mIHRoZSB2YWxpZCBidWNrZXRzLgorICoKKyAqIFJldHVybiB0aGUgYnVmZmVyX2hlYWQgdGhpcyB4YXR0ciBzaG91bGQgcmVzaWRlIGluLiBBbmQgaWYgdGhlIHhhdHRyJ3MKKyAqIGhhc2ggaXMgaW4gdGhlIGdhcCBvZiAyIGJ1Y2tldHMsIHJldHVybiB0aGUgbG93ZXIgYnVja2V0LgorICovCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF9maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgaW50IG5hbWVfaW5kZXgsCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICB1MzIgbmFtZV9oYXNoLAorCQkJCSAgIHU2NCBwX2Jsa25vLAorCQkJCSAgIHUzMiBmaXJzdF9oYXNoLAorCQkJCSAgIHUzMiBudW1fY2x1c3RlcnMsCisJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJaW50IHJldCwgZm91bmQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbG93ZXJfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlID0gTlVMTDsKKwl1MTYgaW5kZXggPSAwOworCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwlpbnQgbG93X2J1Y2tldCA9IDAsIGJ1Y2tldCwgaGlnaF9idWNrZXQ7CisJdTMyIGxhc3RfaGFzaDsKKwl1NjQgYmxrbm87CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBwX2Jsa25vLCAmYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYmgtPmJfZGF0YTsKKwloaWdoX2J1Y2tldCA9IGxlMTZfdG9fY3B1KHhoLT54aF9udW1fYnVja2V0cykgLSAxOworCisJd2hpbGUgKGxvd19idWNrZXQgPD0gaGlnaF9idWNrZXQpIHsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBOVUxMOworCQlidWNrZXQgPSAobG93X2J1Y2tldCArIGhpZ2hfYnVja2V0KSAvIDI7CisKKwkJYmxrbm8gPSBwX2Jsa25vICsgYnVja2V0ICogYmxrX3Blcl9idWNrZXQ7CisKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWJoLT5iX2RhdGE7CisJCXhlID0gJnhoLT54aF9lbnRyaWVzWzBdOworCQlpZiAobmFtZV9oYXNoIDwgbGUzMl90b19jcHUoeGUtPnhlX25hbWVfaGFzaCkpIHsKKwkJCWhpZ2hfYnVja2V0ID0gYnVja2V0IC0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgd2hldGhlciB0aGUgaGFzaCBvZiB0aGUgbGFzdCBlbnRyeSBpbiBvdXIKKwkJICogYnVja2V0IGlzIGxhcmdlciB0aGFuIHRoZSBzZWFyY2ggb25lLiBmb3IgYW4gZW1wdHkKKwkJICogYnVja2V0LCB0aGUgbGFzdCBvbmUgaXMgYWxzbyB0aGUgZmlyc3Qgb25lLgorCQkgKi8KKwkJaWYgKHhoLT54aF9jb3VudCkKKwkJCXhlID0gJnhoLT54aF9lbnRyaWVzW2xlMTZfdG9fY3B1KHhoLT54aF9jb3VudCkgLSAxXTsKKworCQlsYXN0X2hhc2ggPSBsZTMyX3RvX2NwdSh4ZS0+eGVfbmFtZV9oYXNoKTsKKworCQkvKiByZWNvcmQgbG93ZXJfYmggd2hpY2ggbWF5IGJlIHRoZSBpbnNlcnQgcGxhY2UuICovCisJCWJyZWxzZShsb3dlcl9iaCk7CisJCWxvd2VyX2JoID0gYmg7CisJCWJoID0gTlVMTDsKKworCQlpZiAobmFtZV9oYXNoID4gbGUzMl90b19jcHUoeGUtPnhlX25hbWVfaGFzaCkpIHsKKwkJCWxvd19idWNrZXQgPSBidWNrZXQgKyAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB0aGUgc2VhcmNoZWQgeGF0dHIgc2hvdWxkIHJlc2lkZSBpbiB0aGlzIGJ1Y2tldCBpZiBleGlzdHMuICovCisJCXJldCA9IG9jZnMyX2ZpbmRfeGVfaW5fYnVja2V0KGlub2RlLCBsb3dlcl9iaCwKKwkJCQkJICAgICAgbmFtZV9pbmRleCwgbmFtZSwgbmFtZV9oYXNoLAorCQkJCQkgICAgICAmaW5kZXgsICZmb3VuZCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJyZWFrOworCX0KKworCS8qCisJICogUmVjb3JkIHRoZSBidWNrZXQgd2UgaGF2ZSBmb3VuZC4KKwkgKiBXaGVuIHRoZSB4YXR0cidzIGhhc2ggdmFsdWUgaXMgaW4gdGhlIGdhcCBvZiAyIGJ1Y2tldHMsIHdlIHdpbGwKKwkgKiBhbHdheXMgc2V0IGl0IHRvIHRoZSBwcmV2aW91cyBidWNrZXQuCisJICovCisJaWYgKCFsb3dlcl9iaCkgeworCQkvKgorCQkgKiBXZSBjYW4ndCBmaW5kIGFueSBidWNrZXQgd2hvc2UgZmlyc3QgbmFtZV9oYXNoIGlzIGxlc3MKKwkJICogdGhhbiB0aGUgZmluZCBuYW1lX2hhc2guCisJCSAqLworCQlCVUdfT04oYmgtPmJfYmxvY2tuciAhPSBwX2Jsa25vKTsKKwkJbG93ZXJfYmggPSBiaDsKKwkJYmggPSBOVUxMOworCX0KKwl4cy0+YnVja2V0LmJoc1swXSA9IGxvd2VyX2JoOworCXhzLT5idWNrZXQueGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKQorCQkJCQl4cy0+YnVja2V0LmJoc1swXS0+Yl9kYXRhOworCWxvd2VyX2JoID0gTlVMTDsKKworCXhzLT5oZWFkZXIgPSB4cy0+YnVja2V0LnhoOworCXhzLT5iYXNlID0geHMtPmJ1Y2tldC5iaHNbMF0tPmJfZGF0YTsKKwl4cy0+ZW5kID0geHMtPmJhc2UgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisKKwlpZiAoZm91bmQpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBmb3VuZCB0aGUgeGF0dHIgZW50eSwgcmVhZCBhbGwgdGhlIGJsb2NrcyBpbgorCQkgKiB0aGlzIGJ1Y2tldC4KKwkJICovCisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCB4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yICsgMSwKKwkJCQkJYmxrX3Blcl9idWNrZXQgLSAxLCAmeHMtPmJ1Y2tldC5iaHNbMV0sCisJCQkJCU9DRlMyX0JIX0NBQ0hFRCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJeHMtPmhlcmUgPSAmeHMtPmhlYWRlci0+eGhfZW50cmllc1tpbmRleF07CisJCW1sb2coMCwgImZpbmQgeGF0dHIgJXMgaW4gYnVja2V0ICVsbHUsIGVudHJ5ID0gJXVcbiIsIG5hbWUsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yLCBpbmRleCk7CisJfSBlbHNlCisJCXJldCA9IC1FTk9EQVRBOworCitvdXQ6CisJYnJlbHNlKGJoKTsKKwlicmVsc2UobG93ZXJfYmgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfaW5kZXhfYmxvY2tfZmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsCisJCQkJCWludCBuYW1lX2luZGV4LAorCQkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXJvb3RfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4Yl9yb290ID0gJnhiLT54Yl9hdHRycy54Yl9yb290OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmeGJfcm9vdC0+eHRfbGlzdDsKKwl1NjQgcF9ibGtubyA9IDA7CisJdTMyIGZpcnN0X2hhc2gsIG51bV9jbHVzdGVycyA9IDA7CisJdTMyIG5hbWVfaGFzaCA9IG9jZnMyX3hhdHRyX25hbWVfaGFzaChpbm9kZSwgbmFtZSwgc3RybGVuKG5hbWUpKTsKKworCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwltbG9nKDAsICJmaW5kIHhhdHRyICVzLCBoYXNoID0gJXUsIGluZGV4ID0gJWQgaW4geGF0dHIgdHJlZVxuIiwKKwkgICAgIG5hbWUsIG5hbWVfaGFzaCwgbmFtZV9pbmRleCk7CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfcmVjKGlub2RlLCBuYW1lX2hhc2gsICZwX2Jsa25vLCAmZmlyc3RfaGFzaCwKKwkJCQkgICZudW1fY2x1c3RlcnMsIGVsKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJQlVHX09OKHBfYmxrbm8gPT0gMCB8fCBudW1fY2x1c3RlcnMgPT0gMCB8fCBmaXJzdF9oYXNoID4gbmFtZV9oYXNoKTsKKworCW1sb2coMCwgImZpbmQgeGF0dHIgZXh0ZW50IHJlYyAldSBjbHVzdGVycyBmcm9tICVsbHUsIHRoZSBmaXJzdCBoYXNoICIKKwkgICAgICJpbiB0aGUgcmVjIGlzICV1XG4iLCBudW1fY2x1c3RlcnMsIHBfYmxrbm8sIGZpcnN0X2hhc2gpOworCisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2ZpbmQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIG5hbWVfaGFzaCwKKwkJCQkgICAgICBwX2Jsa25vLCBmaXJzdF9oYXNoLCBudW1fY2x1c3RlcnMsIHhzKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfaXRlcmF0ZV94YXR0cl9idWNrZXRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHU2NCBibGtubywKKwkJCQkgICAgICAgdTMyIGNsdXN0ZXJzLAorCQkJCSAgICAgICB4YXR0cl9idWNrZXRfZnVuYyAqZnVuYywKKwkJCQkgICAgICAgdm9pZCAqcGFyYSkKK3sKKwlpbnQgaSwgaiwgcmV0ID0gMDsKKwlpbnQgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJdTMyIGJwYyA9IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKTsKKwl1MzIgbnVtX2J1Y2tldHMgPSBjbHVzdGVycyAqIGJwYzsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0IGJ1Y2tldDsKKworCW1lbXNldCgmYnVja2V0LCAwLCBzaXplb2YoYnVja2V0KSk7CisKKwltbG9nKDAsICJpdGVyYXRpbmcgeGF0dHIgYnVja2V0cyBpbiAldSBjbHVzdGVycyBzdGFydGluZyBmcm9tICVsbHVcbiIsCisJICAgICBjbHVzdGVycywgYmxrbm8pOworCisJZm9yIChpID0gMDsgaSA8IG51bV9idWNrZXRzOyBpKyssIGJsa25vICs9IGJsa19wZXJfYnVja2V0KSB7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBibGtubywgYmxrX3Blcl9idWNrZXQsCisJCQkJCWJ1Y2tldC5iaHMsIE9DRlMyX0JIX0NBQ0hFRCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYnVja2V0LnhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilidWNrZXQuYmhzWzBdLT5iX2RhdGE7CisJCS8qCisJCSAqIFRoZSByZWFsIGJ1Y2tldCBudW0gaW4gdGhpcyBzZXJpZXMgb2YgYmxvY2tzIGlzIHN0b3JlZAorCQkgKiBpbiB0aGUgMXN0IGJ1Y2tldC4KKwkJICovCisJCWlmIChpID09IDApCisJCQludW1fYnVja2V0cyA9IGxlMTZfdG9fY3B1KGJ1Y2tldC54aC0+eGhfbnVtX2J1Y2tldHMpOworCisJCW1sb2coMCwgIml0ZXJhdGluZyB4YXR0ciBidWNrZXQgJWxsdSwgZmlyc3QgaGFzaCAldVxuIiwgYmxrbm8sCisJCSAgICAgbGUzMl90b19jcHUoYnVja2V0LnhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCkpOworCQlpZiAoZnVuYykgeworCQkJcmV0ID0gZnVuYyhpbm9kZSwgJmJ1Y2tldCwgcGFyYSk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IGJsa19wZXJfYnVja2V0OyBqKyspCisJCQlicmVsc2UoYnVja2V0LmJoc1tqXSk7CisJCW1lbXNldCgmYnVja2V0LCAwLCBzaXplb2YoYnVja2V0KSk7CisJfQorCitvdXQ6CisJZm9yIChqID0gMDsgaiA8IGJsa19wZXJfYnVja2V0OyBqKyspCisJCWJyZWxzZShidWNrZXQuYmhzW2pdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBvY2ZzMl94YXR0cl90cmVlX2xpc3QgeworCWNoYXIgKmJ1ZmZlcjsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJc2l6ZV90IHJlc3VsdDsKK307CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X2dldF9uYW1lX3ZhbHVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGgsCisJCQkJCSAgICAgaW50IGluZGV4LAorCQkJCQkgICAgIGludCAqYmxvY2tfb2ZmLAorCQkJCQkgICAgIGludCAqbmV3X29mZnNldCkKK3sKKwl1MTYgbmFtZV9vZmZzZXQ7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbmFtZV9vZmZzZXQgPSBsZTE2X3RvX2NwdSh4aC0+eGhfZW50cmllc1tpbmRleF0ueGVfbmFtZV9vZmZzZXQpOworCisJKmJsb2NrX29mZiA9IG5hbWVfb2Zmc2V0ID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCSpuZXdfb2Zmc2V0ID0gbmFtZV9vZmZzZXQgJSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY2ZzMl9saXN0X3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKKwkJCQkgICB2b2lkICpwYXJhKQoreworCWludCByZXQgPSAwLCB0eXBlOworCXN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX2xpc3QgKnhsID0gKHN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX2xpc3QgKilwYXJhOworCWludCBpLCBibG9ja19vZmYsIG5ld19vZmZzZXQ7CisJY29uc3QgY2hhciAqcHJlZml4LCAqbmFtZTsKKworCWZvciAoaSA9IDAgOyBpIDwgbGUxNl90b19jcHUoYnVja2V0LT54aC0+eGhfY291bnQpOyBpKyspIHsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICplbnRyeSA9ICZidWNrZXQtPnhoLT54aF9lbnRyaWVzW2ldOworCQl0eXBlID0gb2NmczJfeGF0dHJfZ2V0X3R5cGUoZW50cnkpOworCQlwcmVmaXggPSBvY2ZzMl94YXR0cl9wcmVmaXgodHlwZSk7CisKKwkJaWYgKHByZWZpeCkgeworCQkJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2dldF9uYW1lX3ZhbHVlKGlub2RlLAorCQkJCQkJCQlidWNrZXQtPnhoLAorCQkJCQkJCQlpLAorCQkJCQkJCQkmYmxvY2tfb2ZmLAorCQkJCQkJCQkmbmV3X29mZnNldCk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCisJCQluYW1lID0gKGNvbnN0IGNoYXIgKilidWNrZXQtPmJoc1tibG9ja19vZmZdLT5iX2RhdGEgKworCQkJCW5ld19vZmZzZXQ7CisJCQlyZXQgPSBvY2ZzMl94YXR0cl9saXN0X2VudHJ5KHhsLT5idWZmZXIsCisJCQkJCQkgICAgIHhsLT5idWZmZXJfc2l6ZSwKKwkJCQkJCSAgICAgJnhsLT5yZXN1bHQsCisJCQkJCQkgICAgIHByZWZpeCwgbmFtZSwKKwkJCQkJCSAgICAgZW50cnktPnhlX25hbWVfbGVuKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3RyZWVfbGlzdF9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX3Jvb3QgKnh0LAorCQkJCQkgICAgIGNoYXIgKmJ1ZmZlciwKKwkJCQkJICAgICBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZ4dC0+eHRfbGlzdDsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgbmFtZV9oYXNoID0gVUlOVF9NQVgsIGVfY3BvcyA9IDAsIG51bV9jbHVzdGVycyA9IDA7CisJdTY0IHBfYmxrbm8gPSAwOworCXN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX2xpc3QgeGwgPSB7CisJCS5idWZmZXIgPSBidWZmZXIsCisJCS5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplLAorCQkucmVzdWx0ID0gMCwKKwl9OworCisJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDApCisJCXJldHVybiAwOworCisJd2hpbGUgKG5hbWVfaGFzaCA+IDApIHsKKwkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X3JlYyhpbm9kZSwgbmFtZV9oYXNoLCAmcF9ibGtubywKKwkJCQkJICAmZV9jcG9zLCAmbnVtX2NsdXN0ZXJzLCBlbCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfaXRlcmF0ZV94YXR0cl9idWNrZXRzKGlub2RlLCBwX2Jsa25vLCBudW1fY2x1c3RlcnMsCisJCQkJCQkgIG9jZnMyX2xpc3RfeGF0dHJfYnVja2V0LAorCQkJCQkJICAmeGwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChlX2Nwb3MgPT0gMCkKKwkJCWJyZWFrOworCisJCW5hbWVfaGFzaCA9IGVfY3BvcyAtIDE7CisJfQorCisJcmV0ID0geGwucmVzdWx0Oworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY21wX3hlKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsID0gYSwgKnIgPSBiOworCXUzMiBsX2hhc2ggPSBsZTMyX3RvX2NwdShsLT54ZV9uYW1lX2hhc2gpOworCXUzMiByX2hhc2ggPSBsZTMyX3RvX2NwdShyLT54ZV9uYW1lX2hhc2gpOworCisJaWYgKGxfaGFzaCA+IHJfaGFzaCkKKwkJcmV0dXJuIDE7CisJaWYgKGxfaGFzaCA8IHJfaGFzaCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzd2FwX3hlKHZvaWQgKmEsIHZvaWQgKmIsIGludCBzaXplKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqbCA9IGEsICpyID0gYiwgdG1wOworCisJdG1wID0gKmw7CisJbWVtY3B5KGwsIHIsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKKwltZW1jcHkociwgJnRtcCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkpOworfQorCisvKgorICogV2hlbiB0aGUgb2NmczJfeGF0dHJfYmxvY2sgaXMgZmlsbGVkIHVwLCBuZXcgYnVja2V0IHdpbGwgYmUgY3JlYXRlZAorICogYW5kIGFsbCB0aGUgeGF0dHIgZW50cmllcyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBuZXcgYnVja2V0LgorICogTm90ZTogd2UgbmVlZCB0byBzb3J0IHRoZSBlbnRyaWVzIHNpbmNlIHRoZXkgYXJlIG5vdCBzYXZlZCBpbiBvcmRlcgorICogaW4gdGhlIG9jZnMyX3hhdHRyX2Jsb2NrLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9jcF94YXR0cl9ibG9ja190b19idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4Yl9iaCwKKwkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4aF9iaCwKKwkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoKQoreworCWludCBpLCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJdTE2IG9mZnNldCwgc2l6ZSwgb2ZmX2NoYW5nZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKil4Yl9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhiX3hoID0gJnhiLT54Yl9hdHRycy54Yl9oZWFkZXI7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPQorCQkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopeGhfYmgtPmJfZGF0YTsKKwl1MTYgY291bnQgPSBsZTE2X3RvX2NwdSh4Yl94aC0+eGhfY291bnQpOworCWNoYXIgKnRhcmdldCA9IHhoX2JoLT5iX2RhdGEsICpzcmMgPSB4Yl9iaC0+Yl9kYXRhOworCisJbWxvZygwLCAiY3AgeGF0dHIgZnJvbSBibG9jayAlbGx1IHRvIGJ1Y2tldCAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4Yl9iaC0+Yl9ibG9ja25yLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4aF9iaC0+Yl9ibG9ja25yKTsKKworCW1lbXNldCh4aF9iaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCWlmIChkYXRhX2JoKQorCQltZW1zZXQoZGF0YV9iaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCS8qCisJICogU2luY2UgdGhlIHhlX25hbWVfb2Zmc2V0IGlzIGJhc2VkIG9uIG9jZnMyX3hhdHRyX2hlYWRlciwKKwkgKiB0aGVyZSBpcyBhIG9mZnNldCBjaGFuZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhbmdlIG9mCisJICogb2NmczJfeGF0dHJfaGVhZGVyJ3MgcG9zaXRpb24uCisJICovCisJb2ZmX2NoYW5nZSA9IG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywgeGJfYXR0cnMueGJfaGVhZGVyKTsKKwl4ZSA9ICZ4Yl94aC0+eGhfZW50cmllc1tjb3VudCAtIDFdOworCW9mZnNldCA9IGxlMTZfdG9fY3B1KHhlLT54ZV9uYW1lX29mZnNldCkgKyBvZmZfY2hhbmdlOworCXNpemUgPSBibG9ja3NpemUgLSBvZmZzZXQ7CisKKwkvKiBjb3B5IGFsbCB0aGUgbmFtZXMgYW5kIHZhbHVlcy4gKi8KKwlpZiAoZGF0YV9iaCkKKwkJdGFyZ2V0ID0gZGF0YV9iaC0+Yl9kYXRhOworCW1lbWNweSh0YXJnZXQgKyBvZmZzZXQsIHNyYyArIG9mZnNldCwgc2l6ZSk7CisKKwkvKiBJbml0IG5ldyBoZWFkZXIgbm93LiAqLworCXhoLT54aF9jb3VudCA9IHhiX3hoLT54aF9jb3VudDsKKwl4aC0+eGhfbnVtX2J1Y2tldHMgPSBjcHVfdG9fbGUxNigxKTsKKwl4aC0+eGhfbmFtZV92YWx1ZV9sZW4gPSBjcHVfdG9fbGUxNihzaXplKTsKKwl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFIC0gc2l6ZSk7CisKKwkvKiBjb3B5IGFsbCB0aGUgZW50cmllcy4gKi8KKwl0YXJnZXQgPSB4aF9iaC0+Yl9kYXRhOworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIsIHhoX2VudHJpZXMpOworCXNpemUgPSBjb3VudCAqIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpOworCW1lbWNweSh0YXJnZXQgKyBvZmZzZXQsIChjaGFyICopeGJfeGggKyBvZmZzZXQsIHNpemUpOworCisJLyogQ2hhbmdlIHRoZSB4ZSBvZmZzZXQgZm9yIGFsbCB0aGUgeGUgYmVjYXVzZSBvZiB0aGUgbW92ZS4gKi8KKwlvZmZfY2hhbmdlID0gT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgLSBibG9ja3NpemUgKworCQkgb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrLCB4Yl9hdHRycy54Yl9oZWFkZXIpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlsZTE2X2FkZF9jcHUoJnhoLT54aF9lbnRyaWVzW2ldLnhlX25hbWVfb2Zmc2V0LCBvZmZfY2hhbmdlKTsKKworCW1sb2coMCwgImNvcHkgZW50cnk6IHN0YXJ0ID0gJXUsIHNpemUgPSAldSwgb2Zmc2V0X2NoYW5nZSA9ICV1XG4iLAorCSAgICAgb2Zmc2V0LCBzaXplLCBvZmZfY2hhbmdlKTsKKworCXNvcnQodGFyZ2V0ICsgb2Zmc2V0LCBjb3VudCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSksCisJICAgICBjbXBfeGUsIHN3YXBfeGUpOworfQorCisvKgorICogQWZ0ZXIgd2UgbW92ZSB4YXR0ciBmcm9tIGJsb2NrIHRvIGluZGV4IGJ0cmVlLCB3ZSBoYXZlIHRvCisgKiB1cGRhdGUgb2NmczJfeGF0dHJfc2VhcmNoIHRvIHRoZSBuZXcgeGUgYW5kIGJhc2UuCisgKgorICogV2hlbiB0aGUgZW50cnkgaXMgaW4geGF0dHIgYmxvY2ssIHhhdHRyX2JoIGluZGljYXRlcyB0aGUgc3RvcmFnZSBwbGFjZS4KKyAqIFdoaWxlIGlmIHRoZSBlbnRyeSBpcyBpbiBpbmRleCBiLXRyZWUsICJidWNrZXQiIGluZGljYXRlcyB0aGUKKyAqIHJlYWwgcGxhY2Ugb2YgdGhlIHhhdHRyLgorICovCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3VwZGF0ZV94YXR0cl9zZWFyY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoLAorCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaCkKK3sKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpidWYgPSBvbGRfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKm9sZF94YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilidWY7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqb2xkX3hoID0gJm9sZF94Yi0+eGJfYXR0cnMueGJfaGVhZGVyOworCWludCBpLCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCisJeHMtPmJ1Y2tldC5iaHNbMF0gPSBuZXdfYmg7CisJZ2V0X2JoKG5ld19iaCk7CisJeHMtPmJ1Y2tldC54aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopeHMtPmJ1Y2tldC5iaHNbMF0tPmJfZGF0YTsKKwl4cy0+aGVhZGVyID0geHMtPmJ1Y2tldC54aDsKKworCXhzLT5iYXNlID0gbmV3X2JoLT5iX2RhdGE7CisJeHMtPmVuZCA9IHhzLT5iYXNlICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCisJaWYgKCF4cy0+bm90X2ZvdW5kKSB7CisJCWlmIChPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSAhPSBibG9ja3NpemUpIHsKKwkJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLAorCQkJCQl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yICsgMSwKKwkJCQkJYmxrX3Blcl9idWNrZXQgLSAxLCAmeHMtPmJ1Y2tldC5iaHNbMV0sCisJCQkJCU9DRlMyX0JIX0NBQ0hFRCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisKKwkJCWkgPSB4cy0+aGVyZSAtIG9sZF94aC0+eGhfZW50cmllczsKKwkJCXhzLT5oZXJlID0gJnhzLT5oZWFkZXItPnhoX2VudHJpZXNbaV07CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2NyZWF0ZV9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQoreworCWludCByZXQsIGNyZWRpdHMgPSBPQ0ZTMl9TVUJBTExPQ19BTExPQzsKKwl1MzIgYml0X29mZiwgbGVuOworCXU2NCBibGtubzsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqeGhfYmggPSBOVUxMLCAqZGF0YV9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp4Yl9iaCA9IHhzLT54YXR0cl9iaDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0KKwkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKil4Yl9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX3Jvb3QgKnhyOworCXUxNiB4Yl9mbGFncyA9IGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncyk7CisJdTE2IGJwYiA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKworCW1sb2coMCwgImNyZWF0ZSB4YXR0ciBpbmRleCBibG9jayBmb3IgJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpeGJfYmgtPmJfYmxvY2tucik7CisKKwlCVUdfT04oeGJfZmxhZ3MgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKTsKKworCXJldCA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCAxLCAmZGF0YV9hYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogWFhYOgorCSAqIFdlIGNhbiB1c2UgdGhpcyBsb2NrIGZvciBub3csIGFuZCBtYXliZSBtb3ZlIHRvIGEgZGVkaWNhdGVkIG11dGV4CisJICogaWYgcGVyZm9ybWFuY2UgYmVjb21lcyBhIHByb2JsZW0gbGF0ZXIuCisJICovCisJZG93bl93cml0ZSgmb2ktPmlwX2FsbG9jX3NlbSk7CisKKwkvKgorCSAqIDMgbW9yZSBjcmVkaXRzLCBvbmUgZm9yIHhhdHRyIGJsb2NrIHVwZGF0ZSwgb25lIGZvciB0aGUgMXN0IGJsb2NrCisJICogb2YgdGhlIG5ldyB4YXR0ciBidWNrZXQgYW5kIG9uZSBmb3IgdGhlIHZhbHVlL2RhdGEuCisJICovCisJY3JlZGl0cyArPSAzOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9zZW07CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeGJfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsICZiaXRfb2ZmLCAmbGVuKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCS8qCisJICogVGhlIGJ1Y2tldCBtYXkgc3ByZWFkIGluIG1hbnkgYmxvY2tzLCBhbmQKKwkgKiB3ZSB3aWxsIG9ubHkgdG91Y2ggdGhlIDFzdCBibG9jayBhbmQgdGhlIGxhc3QgYmxvY2sKKwkgKiBpbiB0aGUgd2hvbGUgYnVja2V0KG9uZSBmb3IgZW50cnkgYW5kIG9uZSBmb3IgZGF0YSkuCisJICovCisJYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIGJpdF9vZmYpOworCisJbWxvZygwLCAiYWxsb2NhdGUgMSBjbHVzdGVyIGZyb20gJWxsdSB0byB4YXR0ciBibG9ja1xuIiwgYmxrbm8pOworCisJeGhfYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGJsa25vKTsKKwlpZiAoIXhoX2JoKSB7CisJCXJldCA9IC1FSU87CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCB4aF9iaCk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4aF9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJaWYgKGJwYiA+IDEpIHsKKwkJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmxrbm8gKyBicGIgLSAxKTsKKwkJaWYgKCFkYXRhX2JoKSB7CisJCQlyZXQgPSAtRUlPOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisKKwkJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGRhdGFfYmgpOworCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCX0KKworCW9jZnMyX2NwX3hhdHRyX2Jsb2NrX3RvX2J1Y2tldChpbm9kZSwgeGJfYmgsIHhoX2JoLCBkYXRhX2JoKTsKKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4aF9iaCk7CisJaWYgKGRhdGFfYmgpCisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkYXRhX2JoKTsKKworCW9jZnMyX3hhdHRyX3VwZGF0ZV94YXR0cl9zZWFyY2goaW5vZGUsIHhzLCB4Yl9iaCwgeGhfYmgpOworCisJLyogQ2hhbmdlIGZyb20gb2NmczJfeGF0dHJfaGVhZGVyIHRvIG9jZnMyX3hhdHRyX3RyZWVfcm9vdCAqLworCW1lbXNldCgmeGItPnhiX2F0dHJzLCAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCSAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2ssIHhiX2F0dHJzKSk7CisKKwl4ciA9ICZ4Yi0+eGJfYXR0cnMueGJfcm9vdDsKKwl4ci0+eHRfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMigxKTsKKwl4ci0+eHRfbGFzdF9lYl9ibGsgPSAwOworCXhyLT54dF9saXN0LmxfdHJlZV9kZXB0aCA9IDA7CisJeHItPnh0X2xpc3QubF9jb3VudCA9IGNwdV90b19sZTE2KG9jZnMyX3hhdHRyX3JlY3NfcGVyX3hiKGlub2RlLT5pX3NiKSk7CisJeHItPnh0X2xpc3QubF9uZXh0X2ZyZWVfcmVjID0gY3B1X3RvX2xlMTYoMSk7CisKKwl4ci0+eHRfbGlzdC5sX3JlY3NbMF0uZV9jcG9zID0gMDsKKwl4ci0+eHRfbGlzdC5sX3JlY3NbMF0uZV9ibGtubyA9IGNwdV90b19sZTY0KGJsa25vKTsKKwl4ci0+eHRfbGlzdC5sX3JlY3NbMF0uZV9sZWFmX2NsdXN0ZXJzID0gY3B1X3RvX2xlMTYoMSk7CisKKwl4Yi0+eGJfZmxhZ3MgPSBjcHVfdG9fbGUxNih4Yl9mbGFncyB8IE9DRlMyX1hBVFRSX0lOREVYRUQpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhiX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXRfc2VtOgorCXVwX3dyaXRlKCZvaS0+aXBfYWxsb2Nfc2VtKTsKKworb3V0OgorCWlmIChkYXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7CisKKwlicmVsc2UoeGhfYmgpOworCWJyZWxzZShkYXRhX2JoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY21wX3hlX29mZnNldChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqbCA9IGEsICpyID0gYjsKKwl1MzIgbF9uYW1lX29mZnNldCA9IGxlMTZfdG9fY3B1KGwtPnhlX25hbWVfb2Zmc2V0KTsKKwl1MzIgcl9uYW1lX29mZnNldCA9IGxlMTZfdG9fY3B1KHItPnhlX25hbWVfb2Zmc2V0KTsKKworCWlmIChsX25hbWVfb2Zmc2V0IDwgcl9uYW1lX29mZnNldCkKKwkJcmV0dXJuIDE7CisJaWYgKGxfbmFtZV9vZmZzZXQgPiByX25hbWVfb2Zmc2V0KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZWZyYWcgYSB4YXR0ciBidWNrZXQgaWYgd2UgZmluZCB0aGF0IHRoZSBidWNrZXQgaGFzIHNvbWUKKyAqIGhvbGVzIGJldGVlbiBuYW1lL3ZhbHVlIHBhaXJzLgorICogV2Ugd2lsbCBtb3ZlIGFsbCB0aGUgbmFtZS92YWx1ZSBwYWlycyB0byB0aGUgZW5kIG9mIHRoZSBidWNrZXQKKyAqIHNvIHRoYXQgd2UgY2FuIHNwYXJlIHNvbWUgc3BhY2UgZm9yIGluc2VydGlvbi4KKyAqLworc3RhdGljIGludCBvY2ZzMl9kZWZyYWdfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQpCit7CisJaW50IHJldCwgaTsKKwlzaXplX3QgZW5kLCBvZmZzZXQsIGxlbiwgdmFsdWVfbGVuOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOworCWNoYXIgKmVudHJpZXMsICpidWYsICpidWNrZXRfYnVmID0gTlVMTDsKKwl1NjQgYmxrbm8gPSBidWNrZXQtPmJoc1swXS0+Yl9ibG9ja25yOworCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwl1MTYgeGhfZnJlZV9zdGFydDsKKwlzaXplX3QgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CisKKwliaHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgKiBibGtfcGVyX2J1Y2tldCwKKwkJCUdGUF9OT0ZTKTsKKwlpZiAoIWJocykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgYmxrbm8sIGJsa19wZXJfYnVja2V0LCBiaHMsCisJCQkJT0NGUzJfQkhfQ0FDSEVEKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qCisJICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgb3BlcmF0aW9uIG1vcmUgZWZmaWNpZW50IGFuZCBnZW5lcmljLAorCSAqIHdlIGNvcHkgYWxsIHRoZSBibG9ja3MgaW50byBhIGNvbnRpZ3VvdXMgbWVtb3J5IGFuZCBkbyB0aGUKKwkgKiBkZWZyYWdtZW50IHRoZXJlLCBzbyBpZiBhbnl0aGluZyBpcyBlcnJvciwgd2Ugd2lsbCBub3QgdG91Y2gKKwkgKiB0aGUgcmVhbCBibG9jay4KKwkgKi8KKwlidWNrZXRfYnVmID0ga21hbGxvYyhPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSwgR0ZQX05PRlMpOworCWlmICghYnVja2V0X2J1ZikgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwlidWYgPSBidWNrZXRfYnVmOworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrLCBidWYgKz0gYmxvY2tzaXplKQorCQltZW1jcHkoYnVmLCBiaHNbaV0tPmJfZGF0YSwgYmxvY2tzaXplKTsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKChPQ0ZTMl9TQihpbm9kZS0+aV9zYikpLCBibGtfcGVyX2J1Y2tldCk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJaGFuZGxlID0gTlVMTDsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaHNbaV0sCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gY29tbWl0OworCQl9CisJfQorCisJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWJ1Y2tldF9idWY7CisJZW50cmllcyA9IChjaGFyICopeGgtPnhoX2VudHJpZXM7CisJeGhfZnJlZV9zdGFydCA9IGxlMTZfdG9fY3B1KHhoLT54aF9mcmVlX3N0YXJ0KTsKKworCW1sb2coMCwgImFkanVzdCB4YXR0ciBidWNrZXQgaW4gJWxsdSwgY291bnQgPSAldSwgIgorCSAgICAgInhoX2ZyZWVfc3RhcnQgPSAldSwgeGhfbmFtZV92YWx1ZV9sZW4gPSAldS5cbiIsCisJICAgICBibGtubywgbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KSwgeGhfZnJlZV9zdGFydCwKKwkgICAgIGxlMTZfdG9fY3B1KHhoLT54aF9uYW1lX3ZhbHVlX2xlbikpOworCisJLyoKKwkgKiBzb3J0IGFsbCB0aGUgZW50cmllcyBieSB0aGVpciBvZmZzZXQuCisJICogdGhlIGxhcmdlc3Qgd2lsbCBiZSB0aGUgZmlyc3QsIHNvIHRoYXQgd2UgY2FuCisJICogbW92ZSB0aGVtIHRvIHRoZSBlbmQgb25lIGJ5IG9uZS4KKwkgKi8KKwlzb3J0KGVudHJpZXMsIGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCksCisJICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSwKKwkgICAgIGNtcF94ZV9vZmZzZXQsIHN3YXBfeGUpOworCisJLyogTW92ZSBhbGwgbmFtZS92YWx1ZXMgdG8gdGhlIGVuZCBvZiB0aGUgYnVja2V0LiAqLworCXhlID0geGgtPnhoX2VudHJpZXM7CisJZW5kID0gT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCk7IGkrKywgeGUrKykgeworCQlvZmZzZXQgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpOworCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKQorCQkJdmFsdWVfbGVuID0gT0NGUzJfWEFUVFJfU0laRSgKKwkJCQkJbGU2NF90b19jcHUoeGUtPnhlX3ZhbHVlX3NpemUpKTsKKwkJZWxzZQorCQkJdmFsdWVfbGVuID0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCQlsZW4gPSBPQ0ZTMl9YQVRUUl9TSVpFKHhlLT54ZV9uYW1lX2xlbikgKyB2YWx1ZV9sZW47CisKKwkJLyoKKwkJICogV2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgbmFtZS92YWx1ZSBwYWlyCisJCSAqIGV4aXN0IGluIHRoZSBzYW1lIGJsb2NrLiBTbyBhZGp1c3QgZW5kIHRvCisJCSAqIHRoZSBwcmV2aW91cyBibG9jayBlbmQgaWYgbmVlZGVkLgorCQkgKi8KKwkJaWYgKCgoZW5kIC0gbGVuKSAvIGJsb2Nrc2l6ZSAhPQorCQkJKGVuZCAtIDEpIC8gYmxvY2tzaXplKSkKKwkJCWVuZCA9IGVuZCAtIGVuZCAlIGJsb2Nrc2l6ZTsKKworCQlpZiAoZW5kID4gb2Zmc2V0ICsgbGVuKSB7CisJCQltZW1tb3ZlKGJ1Y2tldF9idWYgKyBlbmQgLSBsZW4sCisJCQkJYnVja2V0X2J1ZiArIG9mZnNldCwgbGVuKTsKKwkJCXhlLT54ZV9uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KGVuZCAtIGxlbik7CisJCX0KKworCQltbG9nX2J1Z19vbl9tc2coZW5kIDwgb2Zmc2V0ICsgbGVuLCAiRGVmcmFnIGNoZWNrIGZhaWxlZCBmb3IgIgorCQkJCSJidWNrZXQgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisKKwkJZW5kIC09IGxlbjsKKwl9CisKKwltbG9nX2J1Z19vbl9tc2coeGhfZnJlZV9zdGFydCA+IGVuZCwgIkRlZnJhZyBjaGVjayBmYWlsZWQgZm9yICIKKwkJCSJidWNrZXQgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisKKwlpZiAoeGhfZnJlZV9zdGFydCA9PSBlbmQpCisJCWdvdG8gY29tbWl0OworCisJbWVtc2V0KGJ1Y2tldF9idWYgKyB4aF9mcmVlX3N0YXJ0LCAwLCBlbmQgLSB4aF9mcmVlX3N0YXJ0KTsKKwl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KGVuZCk7CisKKwkvKiBzb3J0IHRoZSBlbnRyaWVzIGJ5IHRoZWlyIG5hbWVfaGFzaC4gKi8KKwlzb3J0KGVudHJpZXMsIGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCksCisJICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSwKKwkgICAgIGNtcF94ZSwgc3dhcF94ZSk7CisKKwlidWYgPSBidWNrZXRfYnVmOworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrLCBidWYgKz0gYmxvY2tzaXplKSB7CisJCW1lbWNweShiaHNbaV0tPmJfZGF0YSwgYnVmLCBibG9ja3NpemUpOworCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmhzW2ldKTsKKwl9CisKK2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOworb3V0OgorCisJaWYgKGJocykgeworCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKKwkJCWJyZWxzZShiaHNbaV0pOworCX0KKwlrZnJlZShiaHMpOworCisJa2ZyZWUoYnVja2V0X2J1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1vdmUgaGFsZiBudW1zIG9mIHRoZSB4YXR0ciBidWNrZXQgaW4gdGhlIHByZXZpb3VzIGNsdXN0ZXIgdG8gdGhpcyBuZXcKKyAqIGNsdXN0ZXIuIFdlIG9ubHkgdG91Y2ggdGhlIGxhc3QgY2x1c3RlciBvZiB0aGUgcHJldmlvdXMgZXh0ZW5kIHJlY29yZC4KKyAqCisgKiBmaXJzdF9iaCBpcyB0aGUgZmlyc3QgYnVmZmVyX2hlYWQgb2YgYSBzZXJpZXMgb2YgYnVja2V0IGluIHRoZSBzYW1lCisgKiBleHRlbnQgcmVjIGFuZCBoZWFkZXJfYmggaXMgdGhlIGhlYWRlciBvZiBvbmUgYnVja2V0IGluIHRoaXMgY2x1c3Rlci4KKyAqIFRoZXkgd2lsbCBiZSB1cGRhdGVkIGlmIHdlIG1vdmUgdGhlIGRhdGEgaGVhZGVyX2JoIGNvbnRhaW5zIHRvIHRoZSBuZXcKKyAqIGNsdXN0ZXIuIGZpcnN0X2hhc2ggd2lsbCBiZSBzZXQgYXMgdGhlIDFzdCB4ZSdzIG5hbWVfaGFzaCBvZiB0aGUgbmV3IGNsdXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfbXZfeGF0dHJfYnVja2V0X2Nyb3NzX2NsdXN0ZXIoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipmaXJzdF9iaCwKKwkJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmhlYWRlcl9iaCwKKwkJCQkJICAgICAgIHU2NCBuZXdfYmxrbm8sCisJCQkJCSAgICAgICB1NjQgcHJldl9ibGtubywKKwkJCQkJICAgICAgIHUzMiBudW1fY2x1c3RlcnMsCisJCQkJCSAgICAgICB1MzIgKmZpcnN0X2hhc2gpCit7CisJaW50IGksIHJldCwgY3JlZGl0czsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlpbnQgYnBjID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCAxKTsKKwlpbnQgbnVtX2J1Y2tldHMgPSBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKG9zYik7CisJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaCwgKm5ld19iaCwgKnByZXZfYmgsICpuZXdfZmlyc3RfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKm5ld194aDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9CisJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKSgoKmZpcnN0X2JoKS0+Yl9kYXRhKTsKKworCUJVR19PTihsZTE2X3RvX2NwdSh4aC0+eGhfbnVtX2J1Y2tldHMpIDwgbnVtX2J1Y2tldHMpOworCUJVR19PTihPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSA9PSBvc2ItPnNfY2x1c3RlcnNpemUpOworCisJcHJldl9iaCA9ICpmaXJzdF9iaDsKKwlnZXRfYmgocHJldl9iaCk7CisJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXByZXZfYmgtPmJfZGF0YTsKKworCXByZXZfYmxrbm8gKz0gKG51bV9jbHVzdGVycyAtIDEpICogYnBjICsgYnBjIC8gMjsKKworCW1sb2coMCwgIm1vdmUgaGFsZiBvZiB4YXR0cnMgaW4gY2x1c3RlciAlbGx1IHRvICVsbHVcbiIsCisJICAgICBwcmV2X2Jsa25vLCBuZXdfYmxrbm8pOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgMXN0IGhhbGYgb2YgdGhlIG5ldyBjbHVzdGVyIGFuZAorCSAqIDEgbW9yZSBmb3IgdGhlIHVwZGF0ZSBvZiB0aGUgMXN0IGJ1Y2tldCBvZiB0aGUgcHJldmlvdXMKKwkgKiBleHRlbnQgcmVjb3JkLgorCSAqLworCWNyZWRpdHMgPSBicGMgLyAyICsgMTsKKwlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcHJldl9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBicGMgLyAyOyBpKyssIHByZXZfYmxrbm8rKywgbmV3X2Jsa25vKyspIHsKKwkJb2xkX2JoID0gbmV3X2JoID0gTlVMTDsKKwkJbmV3X2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBuZXdfYmxrbm8pOworCQlpZiAoIW5ld19iaCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsIG5ld19iaCk7CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgbmV3X2JoLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlbHNlKG5ld19iaCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHByZXZfYmxrbm8sICZvbGRfYmgpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlbHNlKG5ld19iaCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW1lbWNweShuZXdfYmgtPmJfZGF0YSwgb2xkX2JoLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7CisKKwkJaWYgKGkgPT0gMCkgeworCQkJbmV3X3hoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKiluZXdfYmgtPmJfZGF0YTsKKwkJCW5ld194aC0+eGhfbnVtX2J1Y2tldHMgPSBjcHVfdG9fbGUxNihudW1fYnVja2V0cyAvIDIpOworCisJCQlpZiAoZmlyc3RfaGFzaCkKKwkJCQkqZmlyc3RfaGFzaCA9IGxlMzJfdG9fY3B1KAorCQkJCQluZXdfeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKTsKKwkJCW5ld19maXJzdF9iaCA9IG5ld19iaDsKKwkJCWdldF9iaChuZXdfZmlyc3RfYmgpOworCQl9CisKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG5ld19iaCk7CisKKwkJaWYgKCpoZWFkZXJfYmggPT0gb2xkX2JoKSB7CisJCQlicmVsc2UoKmhlYWRlcl9iaCk7CisJCQkqaGVhZGVyX2JoID0gbmV3X2JoOworCQkJZ2V0X2JoKCpoZWFkZXJfYmgpOworCisJCQlicmVsc2UoKmZpcnN0X2JoKTsKKwkJCSpmaXJzdF9iaCA9IG5ld19maXJzdF9iaDsKKwkJCWdldF9iaCgqZmlyc3RfYmgpOworCQl9CisJCWJyZWxzZShuZXdfYmgpOworCQlicmVsc2Uob2xkX2JoKTsKKwl9CisKKwlsZTE2X2FkZF9jcHUoJnhoLT54aF9udW1fYnVja2V0cywgLShudW1fYnVja2V0cyAvIDIpKTsKKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwcmV2X2JoKTsKK291dDoKKwlicmVsc2UocHJldl9iaCk7CisJYnJlbHNlKG5ld19maXJzdF9iaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHU2NCBibGtubywKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsCisJCQkJICAgaW50IG5ldykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MTYgaSwgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisKKwlpZiAoIW5ldykKKwkJcmV0dXJuIG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBibGtubywKKwkJCQkJIGJsa19wZXJfYnVja2V0LCBiaHMsCisJCQkJCSBPQ0ZTMl9CSF9DQUNIRUQpOworCisJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKKwkJYmhzW2ldID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibGtubyArIGkpOworCQlpZiAoYmhzW2ldID09IE5VTEwpIHsKKwkJCXJldCA9IC1FSU87CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlicmVhazsKKwkJfQorCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgYmhzW2ldKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTW92ZSBoYWxmIG51bSBvZiB0aGUgeGF0dHJzIGluIG9sZCBidWNrZXQoYmxrKSB0byBuZXcgYnVja2V0KG5ld19ibGspLgorICogZmlyc3RfaGFzaCB3aWxsIHJlY29yZCB0aGUgMXN0IGhhc2ggb2YgdGhlIG5ldyBidWNrZXQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfaGFsZl94YXR0cl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgIHU2NCBibGssCisJCQkJICAgdTY0IG5ld19ibGssCisJCQkJICAgdTMyICpmaXJzdF9oYXNoLAorCQkJCSAgIGludCBuZXdfYnVja2V0X2hlYWQpCit7CisJaW50IHJldCwgaTsKKwl1MTYgY291bnQsIHN0YXJ0LCBsZW4sIG5hbWVfdmFsdWVfbGVuLCB4ZV9sZW4sIG5hbWVfb2Zmc2V0OworCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipzX2JocywgKip0X2JocyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGg7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKKwlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCisJbWxvZygwLCAibW92ZSBoYWxmIG9mIHhhdHRycyBmcm9tIGJ1Y2tldCAlbGx1IHRvICVsbHVcbiIsCisJICAgICBibGssIG5ld19ibGspOworCisJc19iaHMgPSBrY2FsbG9jKGJsa19wZXJfYnVja2V0LCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfTk9GUyk7CisJaWYgKCFzX2JocykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChpbm9kZSwgYmxrLCBzX2JocywgMCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHNfYmhzWzBdLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJdF9iaHMgPSBrY2FsbG9jKGJsa19wZXJfYnVja2V0LCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfTk9GUyk7CisJaWYgKCF0X2JocykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChpbm9kZSwgbmV3X2JsaywgdF9iaHMsIG5ld19idWNrZXRfaGVhZCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHRfYmhzW2ldLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIGNvcHkgdGhlIHdob2xlIGJ1Y2tldCB0byB0aGUgbmV3IGZpcnN0LiAqLworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQorCQltZW1jcHkodF9iaHNbaV0tPmJfZGF0YSwgc19iaHNbaV0tPmJfZGF0YSwgYmxvY2tzaXplKTsKKworCS8qIHVwZGF0ZSB0aGUgbmV3IGJ1Y2tldC4gKi8KKwl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopdF9iaHNbMF0tPmJfZGF0YTsKKwljb3VudCA9IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCk7CisJc3RhcnQgPSBjb3VudCAvIDI7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgdG90YWwgbmFtZS92YWx1ZSBsZW4gYW5kIHhoX2ZyZWVfc3RhcnQgZm9yCisJICogdGhlIG9sZCBidWNrZXQgZmlyc3QuCisJICovCisJbmFtZV9vZmZzZXQgPSBPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRTsKKwluYW1lX3ZhbHVlX2xlbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHN0YXJ0OyBpKyspIHsKKwkJeGUgPSAmeGgtPnhoX2VudHJpZXNbaV07CisJCXhlX2xlbiA9IE9DRlMyX1hBVFRSX1NJWkUoeGUtPnhlX25hbWVfbGVuKTsKKwkJaWYgKG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSkKKwkJCXhlX2xlbiArPQorCQkJICAgT0NGUzJfWEFUVFJfU0laRShsZTY0X3RvX2NwdSh4ZS0+eGVfdmFsdWVfc2l6ZSkpOworCQllbHNlCisJCQl4ZV9sZW4gKz0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCQluYW1lX3ZhbHVlX2xlbiArPSB4ZV9sZW47CisJCWlmIChsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpIDwgbmFtZV9vZmZzZXQpCisJCQluYW1lX29mZnNldCA9IGxlMTZfdG9fY3B1KHhlLT54ZV9uYW1lX29mZnNldCk7CisJfQorCisJLyoKKwkgKiBOb3cgYmVnaW4gdGhlIG1vZGlmaWNhdGlvbiB0byB0aGUgbmV3IGJ1Y2tldC4KKwkgKgorCSAqIEluIHRoZSBuZXcgYnVja2V0LCBXZSBqdXN0IG1vdmUgdGhlIHhhdHRyIGVudHJ5IHRvIHRoZSBiZWdpbm5pbmcKKwkgKiBhbmQgZG9uJ3QgdG91Y2ggdGhlIG5hbWUvdmFsdWUuIFNvIHRoZXJlIHdpbGwgYmUgc29tZSBob2xlcyBpbiB0aGUKKwkgKiBidWNrZXQsIGFuZCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCB3aGVuIG9jZnMyX2RlZnJhZ194YXR0cl9idWNrZXQgaXMKKwkgKiBjYWxsZWQuCisJICovCisJeGUgPSAmeGgtPnhoX2VudHJpZXNbc3RhcnRdOworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpICogKGNvdW50IC0gc3RhcnQpOworCW1sb2coMCwgIm12IHhhdHRyIGVudHJ5IGxlbiAlZCBmcm9tICVkIHRvICVkXG4iLCBsZW4sCisJICAgICAoaW50KSgoY2hhciAqKXhlIC0gKGNoYXIgKil4aCksCisJICAgICAoaW50KSgoY2hhciAqKXhoLT54aF9lbnRyaWVzIC0gKGNoYXIgKil4aCkpOworCW1lbW1vdmUoKGNoYXIgKil4aC0+eGhfZW50cmllcywgKGNoYXIgKil4ZSwgbGVuKTsKKwl4ZSA9ICZ4aC0+eGhfZW50cmllc1tjb3VudCAtIHN0YXJ0XTsKKwlsZW4gPSBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSAqIHN0YXJ0OworCW1lbXNldCgoY2hhciAqKXhlLCAwLCBsZW4pOworCisJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfY291bnQsIC1zdGFydCk7CisJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfbmFtZV92YWx1ZV9sZW4sIC1uYW1lX3ZhbHVlX2xlbik7CisKKwkvKiBDYWxjdWxhdGUgeGhfZnJlZV9zdGFydCBmb3IgdGhlIG5ldyBidWNrZXQuICovCisJeGgtPnhoX2ZyZWVfc3RhcnQgPSBjcHVfdG9fbGUxNihPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSk7CisJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCk7IGkrKykgeworCQl4ZSA9ICZ4aC0+eGhfZW50cmllc1tpXTsKKwkJeGVfbGVuID0gT0NGUzJfWEFUVFJfU0laRSh4ZS0+eGVfbmFtZV9sZW4pOworCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKQorCQkJeGVfbGVuICs9CisJCQkgICBPQ0ZTMl9YQVRUUl9TSVpFKGxlNjRfdG9fY3B1KHhlLT54ZV92YWx1ZV9zaXplKSk7CisJCWVsc2UKKwkJCXhlX2xlbiArPSBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisJCWlmIChsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpIDwKKwkJICAgIGxlMTZfdG9fY3B1KHhoLT54aF9mcmVlX3N0YXJ0KSkKKwkJCXhoLT54aF9mcmVlX3N0YXJ0ID0geGUtPnhlX25hbWVfb2Zmc2V0OworCX0KKworCS8qIHNldCB4aC0+eGhfbnVtX2J1Y2tldHMgZm9yIHRoZSBuZXcgeGguICovCisJaWYgKG5ld19idWNrZXRfaGVhZCkKKwkJeGgtPnhoX251bV9idWNrZXRzID0gY3B1X3RvX2xlMTYoMSk7CisJZWxzZQorCQl4aC0+eGhfbnVtX2J1Y2tldHMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHRfYmhzW2ldKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CisKKwkvKiBzdG9yZSB0aGUgZmlyc3RfaGFzaCBvZiB0aGUgbmV3IGJ1Y2tldC4gKi8KKwlpZiAoZmlyc3RfaGFzaCkKKwkJKmZpcnN0X2hhc2ggPSBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpOworCisJLyoKKwkgKiBOb3cgb25seSB1cGRhdGUgdGhlIDFzdCBibG9jayBvZiB0aGUgb2xkIGJ1Y2tldC4KKwkgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBlbnRyeSBoYXMgYmVlbiBzb3J0ZWQgYWxyZWFkeSBhYm92ZS4KKwkgKi8KKwl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopc19iaHNbMF0tPmJfZGF0YTsKKwltZW1zZXQoJnhoLT54aF9lbnRyaWVzW3N0YXJ0XSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkgKiAoY291bnQgLSBzdGFydCkpOworCXhoLT54aF9jb3VudCA9IGNwdV90b19sZTE2KHN0YXJ0KTsKKwl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KG5hbWVfb2Zmc2V0KTsKKwl4aC0+eGhfbmFtZV92YWx1ZV9sZW4gPSBjcHVfdG9fbGUxNihuYW1lX3ZhbHVlX2xlbik7CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgc19iaHNbMF0pOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCWlmIChzX2JocykgeworCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKKwkJCWJyZWxzZShzX2Joc1tpXSk7CisJfQorCWtmcmVlKHNfYmhzKTsKKworCWlmICh0X2JocykgeworCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKKwkJCWJyZWxzZSh0X2Joc1tpXSk7CisJfQorCWtmcmVlKHRfYmhzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDb3B5IHhhdHRyIGZyb20gb25lIGJ1Y2tldCB0byBhbm90aGVyIGJ1Y2tldC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIGpvdXJuYWwgdHJhbnNhY3Rpb24KKyAqIGhhcyBlbm91Z2ggc3BhY2UgZm9yIGpvdXJuYWxpbmcuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfY3BfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJIHU2NCBzX2Jsa25vLAorCQkJCSB1NjQgdF9ibGtubywKKwkJCQkgaW50IHRfaXNfbmV3KQoreworCWludCByZXQsIGk7CisJaW50IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCWludCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqc19iaHMsICoqdF9iaHMgPSBOVUxMOworCisJQlVHX09OKHNfYmxrbm8gPT0gdF9ibGtubyk7CisKKwltbG9nKDAsICJjcCBidWNrZXQgJWxsdSB0byAlbGx1LCB0YXJnZXQgaXMgJWRcbiIsCisJICAgICBzX2Jsa25vLCB0X2Jsa25vLCB0X2lzX25ldyk7CisKKwlzX2JocyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIGJsa19wZXJfYnVja2V0LAorCQkJR0ZQX05PRlMpOworCWlmICghc19iaHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoaW5vZGUsIHNfYmxrbm8sIHNfYmhzLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXRfYmhzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogYmxrX3Blcl9idWNrZXQsCisJCQlHRlBfTk9GUyk7CisJaWYgKCF0X2JocykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChpbm9kZSwgdF9ibGtubywgdF9iaHMsIHRfaXNfbmV3KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHRfYmhzW2ldLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgeworCQltZW1jcHkodF9iaHNbaV0tPmJfZGF0YSwgc19iaHNbaV0tPmJfZGF0YSwgYmxvY2tzaXplKTsKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHRfYmhzW2ldKTsKKwl9CisKK291dDoKKwlpZiAoc19iaHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCisJCQlicmVsc2Uoc19iaHNbaV0pOworCX0KKwlrZnJlZShzX2Jocyk7CisKKwlpZiAodF9iaHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCisJCQlicmVsc2UodF9iaHNbaV0pOworCX0KKwlrZnJlZSh0X2Jocyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29weSBvbmUgeGF0dHIgY2x1c3RlciBmcm9tIHNyY19ibGsgdG8gdG9fYmxrLgorICogVGhlIHRvX2JsayB3aWxsIGJlY29tZSB0aGUgZmlyc3QgYnVja2V0IGhlYWRlciBvZiB0aGUgY2x1c3Rlciwgc28gaXRzCisgKiB4aF9udW1fYnVja2V0cyB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHRoZSBidWNrZXQgbnVtIGluIHRoZSBjbHVzdGVyLgorICovCitzdGF0aWMgaW50IG9jZnMyX2NwX3hhdHRyX2NsdXN0ZXIoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0X2JoLAorCQkJCSAgdTY0IHNyY19ibGssCisJCQkJICB1NjQgdG9fYmxrLAorCQkJCSAgdTMyICpmaXJzdF9oYXNoKQoreworCWludCBpLCByZXQsIGNyZWRpdHM7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJaW50IGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CisJaW50IG51bV9idWNrZXRzID0gb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3Rlcihvc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOworCXU2NCB0b19ibGtfc3RhcnQgPSB0b19ibGs7CisKKwltbG9nKDAsICJjcCB4YXR0cnMgZnJvbSBjbHVzdGVyICVsbHUgdG8gJWxsdVxuIiwgc3JjX2JsaywgdG9fYmxrKTsKKworCS8qCisJICogV2UgbmVlZCB0byB1cGRhdGUgdGhlIG5ldyBjbHVzdGVyIGFuZCAxIG1vcmUgZm9yIHRoZSB1cGRhdGUgb2YKKwkgKiB0aGUgMXN0IGJ1Y2tldCBvZiB0aGUgcHJldmlvdXMgZXh0ZW50IHJlYy4KKwkgKi8KKwljcmVkaXRzID0gYnBjICsgMTsKKwlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmlyc3RfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1Y2tldHM7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9jcF94YXR0cl9idWNrZXQoaW5vZGUsIGhhbmRsZSwKKwkJCQkJICAgIHNyY19ibGssIHRvX2JsaywgMSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3JjX2JsayArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJCXRvX2JsayArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJfQorCisJLyogdXBkYXRlIHRoZSBvbGQgYnVja2V0IGhlYWRlci4gKi8KKwl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopZmlyc3RfYmgtPmJfZGF0YTsKKwlsZTE2X2FkZF9jcHUoJnhoLT54aF9udW1fYnVja2V0cywgLW51bV9idWNrZXRzKTsKKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBmaXJzdF9iaCk7CisKKwkvKiB1cGRhdGUgdGhlIG5ldyBidWNrZXQgaGVhZGVyLiAqLworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHRvX2Jsa19zdGFydCwgJmJoKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWJoLT5iX2RhdGE7CisJeGgtPnhoX251bV9idWNrZXRzID0gY3B1X3RvX2xlMTYobnVtX2J1Y2tldHMpOworCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKworCWlmIChmaXJzdF9oYXNoKQorCQkqZmlyc3RfaGFzaCA9IGxlMzJfdG9fY3B1KHhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCk7CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTW92ZSBoYWxmIG9mIHRoZSB4YXR0cnMgaW4gdGhpcyBjbHVzdGVyIHRvIHRoZSBuZXcgY2x1c3Rlci4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYnVja2V0IHNpemUgPT0gY2x1c3RlciBzaXplLgorICogT3RoZXJ3aXNlIG9jZnMyX212X3hhdHRyX2J1Y2tldF9jcm9zc19jbHVzdGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfaGFsZl94YXR0cl9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgIHU2NCBwcmV2X2JsaywKKwkJCQkgICAgdTY0IG5ld19ibGssCisJCQkJICAgIHUzMiAqZmlyc3RfaGFzaCkKK3sKKwl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJaW50IHJldCwgY3JlZGl0cyA9IDIgKiBibGtfcGVyX2J1Y2tldDsKKworCUJVR19PTihPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSA8IE9DRlMyX1NCKGlub2RlLT5pX3NiKS0+c19jbHVzdGVyc2l6ZSk7CisKKwlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBNb3ZlIGhhbGYgb2YgdGhlIHhhdHRyIGluIHN0YXJ0X2JsayB0byB0aGUgbmV4dCBidWNrZXQuICovCisJcmV0dXJuICBvY2ZzMl9oYWxmX3hhdHRyX2J1Y2tldChpbm9kZSwgaGFuZGxlLCBwcmV2X2JsaywKKwkJCQkJbmV3X2JsaywgZmlyc3RfaGFzaCwgMSk7Cit9CisKKy8qCisgKiBNb3ZlIHNvbWUgeGF0dHJzIGZyb20gdGhlIG9sZCBjbHVzdGVyIHRvIHRoZSBuZXcgb25lIHNpbmNlIHRoZXkgYXJlIG5vdAorICogY29udGlndW91cyBpbiBvY2ZzMiB4YXR0ciB0cmVlLgorICoKKyAqIG5ld19ibGsgc3RhcnRzIGEgbmV3IHNlcGFyYXRlIGNsdXN0ZXIsIGFuZCB3ZSB3aWxsIG1vdmUgc29tZSB4YXR0cnMgZnJvbQorICogcHJldl9ibGsgdG8gaXQuIHZfc3RhcnQgd2lsbCBiZSBzZXQgYXMgdGhlIGZpcnN0IG5hbWUgaGFzaCB2YWx1ZSBpbiB0aGlzCisgKiBuZXcgY2x1c3RlciBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGVfY3BvcyBkdXJpbmcgdHJlZSBpbnNlcnRpb24gYW5kCisgKiBkb24ndCBjb2xsaWRlIHdpdGggb3VyIG9yaWdpbmFsIGItdHJlZSBvcGVyYXRpb25zLiBmaXJzdF9iaCBhbmQgaGVhZGVyX2JoCisgKiB3aWxsIGFsc28gYmUgdXBkYXRlZCBzaW5jZSB0aGV5IHdpbGwgYmUgdXNlZCBpbiBvY2ZzMl9leHRlbmRfeGF0dHJfYnVja2V0CisgKiB0byBleHRlbmQgdGhlIGluc2VydCBidWNrZXQuCisgKgorICogVGhlIHByb2JsZW0gaXMgaG93IG11Y2ggeGF0dHIgc2hvdWxkIHdlIG1vdmUgdG8gdGhlIG5ldyBvbmUgYW5kIHdoZW4gc2hvdWxkCisgKiB3ZSB1cGRhdGUgZmlyc3RfYmggYW5kIGhlYWRlcl9iaD8KKyAqIDEuIElmIGNsdXN0ZXIgc2l6ZSA+IGJ1Y2tldCBzaXplLCB0aGF0IG1lYW5zIHRoZSBwcmV2aW91cyBjbHVzdGVyIGhhcyBtb3JlCisgKiAgICB0aGFuIDEgYnVja2V0LCBzbyBqdXN0IG1vdmUgaGFsZiBudW1zIG9mIGJ1Y2tldCBpbnRvIHRoZSBuZXcgY2x1c3RlciBhbmQKKyAqICAgIHVwZGF0ZSB0aGUgZmlyc3RfYmggYW5kIGhlYWRlcl9iaCBpZiB0aGUgaW5zZXJ0IGJ1Y2tldCBoYXMgYmVlbiBtb3ZlZAorICogICAgdG8gdGhlIG5ldyBjbHVzdGVyLgorICogMi4gSWYgY2x1c3Rlcl9zaXplID09IGJ1Y2tldF9zaXplOgorICogICAgYSkgSWYgdGhlIHByZXZpb3VzIGV4dGVudCByZWMgaGFzIG1vcmUgdGhhbiBvbmUgY2x1c3RlciBhbmQgdGhlIGluc2VydAorICogICAgICAgcGxhY2UgaXNuJ3QgaW4gdGhlIGxhc3QgY2x1c3RlciwgY29weSB0aGUgZW50aXJlIGxhc3QgY2x1c3RlciB0byB0aGUKKyAqICAgICAgIG5ldyBvbmUuIFRoaXMgdGltZSwgd2UgZG9uJ3QgbmVlZCB0byB1cGF0ZSB0aGUgZmlyc3RfYmggYW5kIGhlYWRlcl9iaAorICogICAgICAgc2luY2UgdGhleSB3aWxsIG5vdCBiZSBtb3ZlZCBpbnRvIHRoZSBuZXcgY2x1c3Rlci4KKyAqICAgIGIpIE90aGVyd2lzZSwgbW92ZSB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIHhhdHRycyBpbiB0aGUgbGFzdCBjbHVzdGVyIGludG8KKyAqICAgICAgIHRoZSBuZXcgb25lLiBBbmQgd2Ugc2V0IHRoZSBleHRlbmQgZmxhZyB0byB6ZXJvIGlmIHRoZSBpbnNlcnQgcGxhY2UgaXMKKyAqICAgICAgIG1vdmVkIGludG8gdGhlIG5ldyBhbGxvY2F0ZWQgY2x1c3RlciBzaW5jZSBubyBleHRlbmQgaXMgbmVlZGVkLgorICovCitzdGF0aWMgaW50IG9jZnMyX2FkanVzdF94YXR0cl9jcm9zc19jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZmlyc3RfYmgsCisJCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipoZWFkZXJfYmgsCisJCQkJCSAgICB1NjQgbmV3X2JsaywKKwkJCQkJICAgIHU2NCBwcmV2X2JsaywKKwkJCQkJICAgIHUzMiBwcmV2X2NsdXN0ZXJzLAorCQkJCQkgICAgdTMyICp2X3N0YXJ0LAorCQkJCQkgICAgaW50ICpleHRlbmQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CisKKwltbG9nKDAsICJhZGp1c3QgeGF0dHJzIGZyb20gY2x1c3RlciAlbGx1IGxlbiAldSB0byAlbGx1XG4iLAorCSAgICAgcHJldl9ibGssIHByZXZfY2x1c3RlcnMsIG5ld19ibGspOworCisJaWYgKG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSA+IDEpCisJCXJldCA9IG9jZnMyX212X3hhdHRyX2J1Y2tldF9jcm9zc19jbHVzdGVyKGlub2RlLAorCQkJCQkJCSAgaGFuZGxlLAorCQkJCQkJCSAgZmlyc3RfYmgsCisJCQkJCQkJICBoZWFkZXJfYmgsCisJCQkJCQkJICBuZXdfYmxrLAorCQkJCQkJCSAgcHJldl9ibGssCisJCQkJCQkJICBwcmV2X2NsdXN0ZXJzLAorCQkJCQkJCSAgdl9zdGFydCk7CisJZWxzZSB7CisJCXU2NCBsYXN0X2JsayA9IHByZXZfYmxrICsgYnBjICogKHByZXZfY2x1c3RlcnMgLSAxKTsKKworCQlpZiAocHJldl9jbHVzdGVycyA+IDEgJiYgKCpoZWFkZXJfYmgpLT5iX2Jsb2NrbnIgIT0gbGFzdF9ibGspCisJCQlyZXQgPSBvY2ZzMl9jcF94YXR0cl9jbHVzdGVyKGlub2RlLCBoYW5kbGUsICpmaXJzdF9iaCwKKwkJCQkJCSAgICAgbGFzdF9ibGssIG5ld19ibGssCisJCQkJCQkgICAgIHZfc3RhcnQpOworCQllbHNlIHsKKwkJCXJldCA9IG9jZnMyX2hhbGZfeGF0dHJfY2x1c3Rlcihpbm9kZSwgaGFuZGxlLAorCQkJCQkJICAgICAgIGxhc3RfYmxrLCBuZXdfYmxrLAorCQkJCQkJICAgICAgIHZfc3RhcnQpOworCisJCQlpZiAoKCpoZWFkZXJfYmgpLT5iX2Jsb2NrbnIgPT0gbGFzdF9ibGsgJiYgZXh0ZW5kKQorCQkJCSpleHRlbmQgPSAwOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFkZCBhIG5ldyBjbHVzdGVyIGZvciB4YXR0ciBzdG9yYWdlLgorICoKKyAqIElmIHRoZSBuZXcgY2x1c3RlciBpcyBjb250aWd1b3VzIHdpdGggdGhlIHByZXZpb3VzIG9uZSwgaXQgd2lsbCBiZQorICogYXBwZW5kZWQgdG8gdGhlIHNhbWUgZXh0ZW50IHJlY29yZCwgYW5kIG51bV9jbHVzdGVycyB3aWxsIGJlIHVwZGF0ZWQuCisgKiBJZiBub3QsIHdlIHdpbGwgaW5zZXJ0IGEgbmV3IGV4dGVudCBmb3IgaXQgYW5kIG1vdmUgc29tZSB4YXR0cnMgaW4KKyAqIHRoZSBsYXN0IGNsdXN0ZXIgaW50byB0aGUgbmV3IGFsbG9jYXRlZCBvbmUuCisgKiBXZSBhbHNvIG5lZWQgdG8gbGltaXQgdGhlIG1heGltdW0gc2l6ZSBvZiBhIGJ0cmVlIGxlYWYsIG90aGVyd2lzZSB3ZSdsbAorICogbG9zZSB0aGUgYmVuZWZpdHMgb2YgaGFzaGluZyBiZWNhdXNlIHdlJ2xsIGhhdmUgdG8gc2VhcmNoIGxhcmdlIGxlYXZlcy4KKyAqIFNvIG5vdyB0aGUgbWF4aW11bSBzaXplIGlzIE9DRlMyX01BWF9YQVRUUl9UUkVFX0xFQUZfU0laRShvciBjbHVzdGVyc2l6ZSwKKyAqIGlmIGl0J3MgYmlnZ2VyKS4KKyAqCisgKiBmaXJzdF9iaCBpcyB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHByZXZpb3VzIGV4dGVudCByZWMgYW5kIGhlYWRlcl9iaAorICogaW5kaWNhdGVzIHRoZSBidWNrZXQgd2Ugd2lsbCBpbnNlcnQgdGhlIG5ldyB4YXR0cnMuIFRoZXkgd2lsbCBiZSB1cGRhdGVkCisgKiB3aGVuIHRoZSBoZWFkZXJfYmggaXMgbW92ZWQgaW50byB0aGUgbmV3IGNsdXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfYWRkX25ld194YXR0cl9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZmlyc3RfYmgsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmhlYWRlcl9iaCwKKwkJCQkgICAgICAgdTMyICpudW1fY2x1c3RlcnMsCisJCQkJICAgICAgIHUzMiBwcmV2X2Nwb3MsCisJCQkJICAgICAgIHU2NCBwcmV2X2Jsa25vLAorCQkJCSAgICAgICBpbnQgKmV4dGVuZCkKK3sKKwlpbnQgcmV0LCBjcmVkaXRzOworCXUxNiBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOworCXUzMiBwcmV2X2NsdXN0ZXJzID0gKm51bV9jbHVzdGVyczsKKwl1MzIgY2x1c3RlcnNfdG9fYWRkID0gMSwgYml0X29mZiwgbnVtX2JpdHMsIHZfc3RhcnQgPSAwOworCXU2NCBibG9jazsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKworCW1sb2coMCwgIkFkZCBuZXcgeGF0dHIgY2x1c3RlciBmb3IgJWxsdSwgcHJldmlvdXMgeGF0dHIgaGFzaCA9ICV1LCAiCisJICAgICAicHJldmlvdXMgeGF0dHIgYmxrbm8gPSAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJICAgICBwcmV2X2Nwb3MsIHByZXZfYmxrbm8pOworCisJb2NmczJfaW5pdF94YXR0cl90cmVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHJvb3RfYmgpOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIGNsdXN0ZXJzX3RvX2FkZCwgMCwKKwkJCQkgICAgJmRhdGFfYWMsICZtZXRhX2FjKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLCBldC5ldF9yb290X2VsLAorCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWhhbmRsZSA9IE5VTEw7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByb290X2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJcmV0ID0gX19vY2ZzMl9jbGFpbV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgZGF0YV9hYywgMSwKKwkJCQkgICAgIGNsdXN0ZXJzX3RvX2FkZCwgJmJpdF9vZmYsICZudW1fYml0cyk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCAhPSAtRU5PU1BDKQorCQkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIGxlYXZlOworCX0KKworCUJVR19PTihudW1fYml0cyA+IGNsdXN0ZXJzX3RvX2FkZCk7CisKKwlibG9jayA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKTsKKwltbG9nKDAsICJBbGxvY2F0aW5nICV1IGNsdXN0ZXJzIGF0IGJsb2NrICV1IGZvciB4YXR0ciBpbiBpbm9kZSAlbGx1XG4iLAorCSAgICAgbnVtX2JpdHMsIGJpdF9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKworCWlmIChwcmV2X2Jsa25vICsgcHJldl9jbHVzdGVycyAqIGJwYyA9PSBibG9jayAmJgorCSAgICAocHJldl9jbHVzdGVycyArIG51bV9iaXRzKSA8PCBvc2ItPnNfY2x1c3RlcnNpemVfYml0cyA8PQorCSAgICAgT0NGUzJfTUFYX1hBVFRSX1RSRUVfTEVBRl9TSVpFKSB7CisJCS8qCisJCSAqIElmIHRoaXMgY2x1c3RlciBpcyBjb250aWd1b3VzIHdpdGggdGhlIG9sZCBvbmUgYW5kCisJCSAqIGFkZGluZyB0aGlzIG5ldyBjbHVzdGVyLCB3ZSBkb24ndCBzdXJwYXNzIHRoZSBsaW1pdCBvZgorCQkgKiBPQ0ZTMl9NQVhfWEFUVFJfVFJFRV9MRUFGX1NJWkUsIGNvb2wuIFdlIHdpbGwgbGV0IGl0IGJlCisJCSAqIGluaXRpYWxpemVkIGFuZCB1c2VkIGxpa2Ugb3RoZXIgYnVja2V0cyBpbiB0aGUgcHJldmlvdXMKKwkJICogY2x1c3Rlci4KKwkJICogU28gYWRkIGl0IGFzIGEgY29udGlndW91cyBvbmUuIFRoZSBjYWxsZXIgd2lsbCBoYW5kbGUKKwkJICogaXRzIGluaXQgcHJvY2Vzcy4KKwkJICovCisJCXZfc3RhcnQgPSBwcmV2X2Nwb3MgKyBwcmV2X2NsdXN0ZXJzOworCQkqbnVtX2NsdXN0ZXJzID0gcHJldl9jbHVzdGVycyArIG51bV9iaXRzOworCQltbG9nKDAsICJBZGQgY29udGlndW91cyAldSBjbHVzdGVycyB0byBwcmV2aW91cyBleHRlbnQgcmVjLlxuIiwKKwkJICAgICBudW1fYml0cyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gb2NmczJfYWRqdXN0X3hhdHRyX2Nyb3NzX2NsdXN0ZXIoaW5vZGUsCisJCQkJCQkgICAgICAgaGFuZGxlLAorCQkJCQkJICAgICAgIGZpcnN0X2JoLAorCQkJCQkJICAgICAgIGhlYWRlcl9iaCwKKwkJCQkJCSAgICAgICBibG9jaywKKwkJCQkJCSAgICAgICBwcmV2X2Jsa25vLAorCQkJCQkJICAgICAgIHByZXZfY2x1c3RlcnMsCisJCQkJCQkgICAgICAgJnZfc3RhcnQsCisJCQkJCQkgICAgICAgZXh0ZW5kKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0KKworCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPCBjcmVkaXRzKSB7CisJCS8qCisJCSAqIFRoZSBqb3VybmFsIGhhcyBiZWVuIHJlc3RhcnRlZCBiZWZvcmUsIGFuZCBkb24ndAorCQkgKiBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGluc2VydGlvbiwgc28gZXh0ZW5kIGl0CisJCSAqIGhlcmUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0KKwltbG9nKDAsICJJbnNlcnQgJXUgY2x1c3RlcnMgYXQgYmxvY2sgJWxsdSBmb3IgeGF0dHIgYXQgJXVcbiIsCisJICAgICBudW1fYml0cywgYmxvY2ssIHZfc3RhcnQpOworCXJldCA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGlub2RlLCAmZXQsIHZfc3RhcnQsIGJsb2NrLAorCQkJCSAgbnVtX2JpdHMsIDAsIG1ldGFfYWMpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcm9vdF9iaCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIGxlYXZlOworCX0KKworbGVhdmU6CisJaWYgKGhhbmRsZSkKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKwlpZiAoZGF0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRXh0ZW5kIGEgbmV3IHhhdHRyIGJ1Y2tldCBhbmQgbW92ZSB4YXR0cnMgdG8gdGhlIGVuZCBvbmUgYnkgb25lIHVudGlsCisgKiBXZSBtZWV0IHdpdGggc3RhcnRfYmguIE9ubHkgbW92ZSBoYWxmIG9mIHRoZSB4YXR0cnMgdG8gdGhlIGJ1Y2tldCBhZnRlciBpdC4KKyAqLworc3RhdGljIGludCBvY2ZzMl9leHRlbmRfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0X2JoLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzdGFydF9iaCwKKwkJCQkgICAgIHUzMiBudW1fY2x1c3RlcnMpCit7CisJaW50IHJldCwgY3JlZGl0czsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJdTY0IHN0YXJ0X2JsayA9IHN0YXJ0X2JoLT5iX2Jsb2NrbnIsIGVuZF9ibGs7CisJdTMyIG51bV9idWNrZXRzID0gbnVtX2NsdXN0ZXJzICogb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3Rlcihvc2IpOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqZmlyc3RfeGggPQorCQkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopZmlyc3RfYmgtPmJfZGF0YTsKKwl1MTYgYnVja2V0ID0gbGUxNl90b19jcHUoZmlyc3RfeGgtPnhoX251bV9idWNrZXRzKTsKKworCW1sb2coMCwgImV4dGVuZCB4YXR0ciBidWNrZXQgaW4gJWxsdSwgeGF0dHIgZXh0ZW5kIHJlYyBzdGFydGluZyAiCisJICAgICAiZnJvbSAlbGx1LCBsZW4gPSAldVxuIiwgc3RhcnRfYmxrLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmaXJzdF9iaC0+Yl9ibG9ja25yLCBudW1fY2x1c3RlcnMpOworCisJQlVHX09OKGJ1Y2tldCA+PSBudW1fYnVja2V0cyk7CisKKwllbmRfYmxrID0gZmlyc3RfYmgtPmJfYmxvY2tuciArIChidWNrZXQgLSAxKSAqIGJsa19wZXJfYnVja2V0OworCisJLyoKKwkgKiBXZSB3aWxsIHRvdWNoIGFsbCB0aGUgYnVja2V0cyBhZnRlciB0aGUgc3RhcnRfYmgoaW5jbHVkZSBpdCkuCisJICogQWRkIG9uZSBtb3JlIGJ1Y2tldCBhbmQgbW9kaWZ5IHRoZSBmaXJzdF9iaC4KKwkgKi8KKwljcmVkaXRzID0gZW5kX2JsayAtIHN0YXJ0X2JsayArIDIgKiBibGtfcGVyX2J1Y2tldCArIDE7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQloYW5kbGUgPSBOVUxMOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZpcnN0X2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBjb21taXQ7CisJfQorCisJd2hpbGUgKGVuZF9ibGsgIT0gc3RhcnRfYmxrKSB7CisJCXJldCA9IG9jZnMyX2NwX3hhdHRyX2J1Y2tldChpbm9kZSwgaGFuZGxlLCBlbmRfYmxrLAorCQkJCQkgICAgZW5kX2JsayArIGJsa19wZXJfYnVja2V0LCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY29tbWl0OworCQllbmRfYmxrIC09IGJsa19wZXJfYnVja2V0OworCX0KKworCS8qIE1vdmUgaGFsZiBvZiB0aGUgeGF0dHIgaW4gc3RhcnRfYmxrIHRvIHRoZSBuZXh0IGJ1Y2tldC4gKi8KKwlyZXQgPSBvY2ZzMl9oYWxmX3hhdHRyX2J1Y2tldChpbm9kZSwgaGFuZGxlLCBzdGFydF9ibGssCisJCQkJICAgICAgc3RhcnRfYmxrICsgYmxrX3Blcl9idWNrZXQsIE5VTEwsIDApOworCisJbGUxNl9hZGRfY3B1KCZmaXJzdF94aC0+eGhfbnVtX2J1Y2tldHMsIDEpOworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBmaXJzdF9iaCk7CisKK2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBZGQgbmV3IHhhdHRyIGJ1Y2tldCBpbiBhbiBleHRlbnQgcmVjb3JkIGFuZCBhZGp1c3QgdGhlIGJ1Y2tldHMgYWNjb3JkaW5nbHkuCisgKiB4Yl9iaCBpcyB0aGUgb2NmczJfeGF0dHJfYmxvY2suCisgKiBXZSB3aWxsIG1vdmUgYWxsIHRoZSBidWNrZXRzIHN0YXJ0aW5nIGZyb20gaGVhZGVyX2JoIHRvIHRoZSBuZXh0IHBsYWNlLiBBcworICogZm9yIHRoaXMgb25lLCBoYWxmIG51bSBvZiBpdHMgeGF0dHJzIHdpbGwgYmUgbW92ZWQgdG8gdGhlIG5leHQgb25lLgorICoKKyAqIFdlIHdpbGwgYWxsb2NhdGUgYSBuZXcgY2x1c3RlciBpZiBjdXJyZW50IGNsdXN0ZXIgaXMgZnVsbCBhbmQgYWRqdXN0CisgKiBoZWFkZXJfYmggYW5kIGZpcnN0X2JoIGlmIHRoZSBpbnNlcnQgcGxhY2UgaXMgbW92ZWQgdG8gdGhlIG5ldyBjbHVzdGVyLgorICovCitzdGF0aWMgaW50IG9jZnMyX2FkZF9uZXdfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4Yl9iaCwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWRlcl9iaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpmaXJzdF94aCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YiA9CisJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeGJfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4Yl9yb290ID0gJnhiLT54Yl9hdHRycy54Yl9yb290OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmeGJfcm9vdC0+eHRfbGlzdDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9CisJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWhlYWRlcl9iaC0+Yl9kYXRhOworCXUzMiBuYW1lX2hhc2ggPSBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKHNiKTsKKwlpbnQgcmV0LCBudW1fYnVja2V0cywgZXh0ZW5kID0gMTsKKwl1NjQgcF9ibGtubzsKKwl1MzIgZV9jcG9zLCBudW1fY2x1c3RlcnM7CisKKwltbG9nKDAsICJBZGQgbmV3IHhhdHRyIGJ1Y2tldCBzdGFydGluZyBmb3JtICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWhlYWRlcl9iaC0+Yl9ibG9ja25yKTsKKworCS8qCisJICogQWRkIHJlZnJlbmNlIGZvciBoZWFkZXJfYmggaGVyZSBiZWNhdXNlIGl0IG1heSBiZQorCSAqIGNoYW5nZWQgaW4gb2NmczJfYWRkX25ld194YXR0cl9jbHVzdGVyIGFuZCB3ZSBuZWVkCisJICogdG8gZnJlZSBpdCBpbiB0aGUgZW5kLgorCSAqLworCWdldF9iaChoZWFkZXJfYmgpOworCisJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X3JlYyhpbm9kZSwgbmFtZV9oYXNoLCAmcF9ibGtubywgJmVfY3BvcywKKwkJCQkgICZudW1fY2x1c3RlcnMsIGVsKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgcF9ibGtubywgJmZpcnN0X2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJbnVtX2J1Y2tldHMgPSBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKG9zYikgKiBudW1fY2x1c3RlcnM7CisJZmlyc3RfeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWZpcnN0X2JoLT5iX2RhdGE7CisKKwlpZiAobnVtX2J1Y2tldHMgPT0gbGUxNl90b19jcHUoZmlyc3RfeGgtPnhoX251bV9idWNrZXRzKSkgeworCQlyZXQgPSBvY2ZzMl9hZGRfbmV3X3hhdHRyX2NsdXN0ZXIoaW5vZGUsCisJCQkJCQkgIHhiX2JoLAorCQkJCQkJICAmZmlyc3RfYmgsCisJCQkJCQkgICZoZWFkZXJfYmgsCisJCQkJCQkgICZudW1fY2x1c3RlcnMsCisJCQkJCQkgIGVfY3BvcywKKwkJCQkJCSAgcF9ibGtubywKKwkJCQkJCSAgJmV4dGVuZCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGV4dGVuZCkKKwkJcmV0ID0gb2NmczJfZXh0ZW5kX3hhdHRyX2J1Y2tldChpbm9kZSwKKwkJCQkJCWZpcnN0X2JoLAorCQkJCQkJaGVhZGVyX2JoLAorCQkJCQkJbnVtX2NsdXN0ZXJzKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CitvdXQ6CisJYnJlbHNlKGZpcnN0X2JoKTsKKwlicmVsc2UoaGVhZGVyX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKm9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfdmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKKwkJCQkJaW50IG9mZnMpCit7CisJaW50IGJsb2NrX29mZiA9IG9mZnMgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlvZmZzID0gb2ZmcyAlIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlyZXR1cm4gYnVja2V0LT5iaHNbYmxvY2tfb2ZmXS0+Yl9kYXRhICsgb2ZmczsKK30KKworLyoKKyAqIEhhbmRsZSB0aGUgbm9ybWFsIHhhdHRyIHNldCwgaW5jbHVkaW5nIHJlcGxhY2UsIGRlbGV0ZSBhbmQgbmV3LgorICoKKyAqIE5vdGU6ICJsb2NhbCIgaW5kaWNhdGVzIHRoZSByZWFsIGRhdGEncyBsb2NhbGl0eS4gU28gd2UgY2FuJ3QKKyAqIGp1c3QgaXRzIGJ1Y2tldCBsb2NhbGl0eSBieSBpdHMgbGVuZ3RoLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl9zZXRfZW50cnlfbm9ybWFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJIHUzMiBuYW1lX2hhc2gsCisJCQkJCSBpbnQgbG9jYWwpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsYXN0LCAqeGU7CisJaW50IG5hbWVfbGVuID0gc3RybGVuKHhpLT5uYW1lKTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IHhzLT5oZWFkZXI7CisJdTE2IGNvdW50ID0gbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KSwgc3RhcnQ7CisJc2l6ZV90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwljaGFyICp2YWw7CisJc2l6ZV90IG9mZnMsIHNpemUsIG5ld19zaXplOworCisJbGFzdCA9ICZ4aC0+eGhfZW50cmllc1tjb3VudF07CisJaWYgKCF4cy0+bm90X2ZvdW5kKSB7CisJCXhlID0geHMtPmhlcmU7CisJCW9mZnMgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpOworCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKQorCQkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCU9DRlMyX1hBVFRSX1NJWkUobGU2NF90b19jcHUoeGUtPnhlX3ZhbHVlX3NpemUpKTsKKwkJZWxzZQorCQkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCU9DRlMyX1hBVFRSX1NJWkUoT0NGUzJfWEFUVFJfUk9PVF9TSVpFKTsKKworCQkvKgorCQkgKiBJZiB0aGUgbmV3IHZhbHVlIHdpbGwgYmUgc3RvcmVkIG91dHNpZGUsIHhpLT52YWx1ZSBoYXMgYmVlbgorCQkgKiBpbml0YWxpemVkIGFzIGFuIGVtcHR5IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QsIGFuZCB0aGUgc2FtZQorCQkgKiBnb2VzIHdpdGggeGktPnZhbHVlX2xlbiwgc28gd2UgY2FuIHNldCBuZXdfc2l6ZSBzYWZlbHkgaGVyZS4KKwkJICogU2VlIG9jZnMyX3hhdHRyX3NldF9pbl9idWNrZXQuCisJCSAqLworCQluZXdfc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCSAgIE9DRlMyX1hBVFRSX1NJWkUoeGktPnZhbHVlX2xlbik7CisKKwkJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfbmFtZV92YWx1ZV9sZW4sIC1zaXplKTsKKwkJaWYgKHhpLT52YWx1ZSkgeworCQkJaWYgKG5ld19zaXplID4gc2l6ZSkKKwkJCQlnb3RvIHNldF9uZXdfbmFtZV92YWx1ZTsKKworCQkJLyogTm93IHJlcGxhY2UgdGhlIG9sZCB2YWx1ZSB3aXRoIG5ldyBvbmUuICovCisJCQlpZiAobG9jYWwpCisJCQkJeGUtPnhlX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGU2NCh4aS0+dmFsdWVfbGVuKTsKKwkJCWVsc2UKKwkJCQl4ZS0+eGVfdmFsdWVfc2l6ZSA9IDA7CisKKwkJCXZhbCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfdmFsKGlub2RlLAorCQkJCQkJCSAmeHMtPmJ1Y2tldCwgb2Zmcyk7CisJCQltZW1zZXQodmFsICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbiksIDAsCisJCQkgICAgICAgc2l6ZSAtIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pKTsKKwkJCWlmIChPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pID4gMCkKKwkJCQltZW1jcHkodmFsICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbiksCisJCQkJICAgICAgIHhpLT52YWx1ZSwgeGktPnZhbHVlX2xlbik7CisKKwkJCWxlMTZfYWRkX2NwdSgmeGgtPnhoX25hbWVfdmFsdWVfbGVuLCBuZXdfc2l6ZSk7CisJCQlvY2ZzMl94YXR0cl9zZXRfbG9jYWwoeGUsIGxvY2FsKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBSZW1vdmUgdGhlIG9sZCBlbnRyeSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLgorCQkJICogV2UgZG9uJ3QgcmVtb3ZlIHRoZSBsYXN0IGVudHJ5IHNvIHRoYXQgd2UgY2FuCisJCQkgKiB1c2UgaXQgdG8gaW5kaWNhdGUgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGVtcHR5CisJCQkgKiBidWNrZXQuCisJCQkgKi8KKwkJCWxhc3QgLT0gMTsKKwkJCWxlMTZfYWRkX2NwdSgmeGgtPnhoX2NvdW50LCAtMSk7CisJCQlpZiAoeGgtPnhoX2NvdW50KSB7CisJCQkJbWVtbW92ZSh4ZSwgeGUgKyAxLAorCQkJCQkodm9pZCAqKWxhc3QgLSAodm9pZCAqKXhlKTsKKwkJCQltZW1zZXQobGFzdCwgMCwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkpOworCQkJfSBlbHNlCisJCQkJeGgtPnhoX2ZyZWVfc3RhcnQgPQorCQkJCQljcHVfdG9fbGUxNihPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSk7CisKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGZpbmQgYSBuZXcgZW50cnkgZm9yIGluc2VydC4gKi8KKwkJaW50IGxvdyA9IDAsIGhpZ2ggPSBjb3VudCAtIDEsIHRtcDsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp0bXBfeGU7CisKKwkJd2hpbGUgKGxvdyA8PSBoaWdoICYmIGNvdW50KSB7CisJCQl0bXAgPSAobG93ICsgaGlnaCkgLyAyOworCQkJdG1wX3hlID0gJnhoLT54aF9lbnRyaWVzW3RtcF07CisKKwkJCWlmIChuYW1lX2hhc2ggPiBsZTMyX3RvX2NwdSh0bXBfeGUtPnhlX25hbWVfaGFzaCkpCisJCQkJbG93ID0gdG1wICsgMTsKKwkJCWVsc2UgaWYgKG5hbWVfaGFzaCA8CisJCQkJIGxlMzJfdG9fY3B1KHRtcF94ZS0+eGVfbmFtZV9oYXNoKSkKKwkJCQloaWdoID0gdG1wIC0gMTsKKwkJCWVsc2UgeworCQkJCWxvdyA9IHRtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXhlID0gJnhoLT54aF9lbnRyaWVzW2xvd107CisJCWlmIChsb3cgIT0gY291bnQpCisJCQltZW1tb3ZlKHhlICsgMSwgeGUsICh2b2lkICopbGFzdCAtICh2b2lkICopeGUpOworCisJCWxlMTZfYWRkX2NwdSgmeGgtPnhoX2NvdW50LCAxKTsKKwkJbWVtc2V0KHhlLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSk7CisJCXhlLT54ZV9uYW1lX2hhc2ggPSBjcHVfdG9fbGUzMihuYW1lX2hhc2gpOworCQl4ZS0+eGVfbmFtZV9sZW4gPSBuYW1lX2xlbjsKKwkJb2NmczJfeGF0dHJfc2V0X3R5cGUoeGUsIHhpLT5uYW1lX2luZGV4KTsKKwl9CisKK3NldF9uZXdfbmFtZV92YWx1ZToKKwkvKiBJbnNlcnQgdGhlIG5ldyBuYW1lK3ZhbHVlLiAqLworCXNpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArIE9DRlMyX1hBVFRSX1NJWkUoeGktPnZhbHVlX2xlbik7CisKKwkvKgorCSAqIFdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIG5hbWUvdmFsdWUgcGFpcgorCSAqIGV4aXN0cyBpbiB0aGUgc2FtZSBibG9jay4KKwkgKi8KKwlvZmZzID0gbGUxNl90b19jcHUoeGgtPnhoX2ZyZWVfc3RhcnQpOworCXN0YXJ0ID0gb2ZmcyAtIHNpemU7CisKKwlpZiAoc3RhcnQgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgIT0KKwkgICAgKG9mZnMgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgeworCQlvZmZzID0gb2ZmcyAtIG9mZnMgJSBibG9ja3NpemU7CisJCXhoLT54aF9mcmVlX3N0YXJ0ID0gY3B1X3RvX2xlMTYob2Zmcyk7CisJfQorCisJdmFsID0gb2NmczJfeGF0dHJfYnVja2V0X2dldF92YWwoaW5vZGUsCisJCQkJCSAmeHMtPmJ1Y2tldCwgb2ZmcyAtIHNpemUpOworCXhlLT54ZV9uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KG9mZnMgLSBzaXplKTsKKworCW1lbXNldCh2YWwsIDAsIHNpemUpOworCW1lbWNweSh2YWwsIHhpLT5uYW1lLCBuYW1lX2xlbik7CisJbWVtY3B5KHZhbCArIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pLCB4aS0+dmFsdWUsIHhpLT52YWx1ZV9sZW4pOworCisJeGUtPnhlX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGU2NCh4aS0+dmFsdWVfbGVuKTsKKwlvY2ZzMl94YXR0cl9zZXRfbG9jYWwoeGUsIGxvY2FsKTsKKwl4cy0+aGVyZSA9IHhlOworCWxlMTZfYWRkX2NwdSgmeGgtPnhoX2ZyZWVfc3RhcnQsIC1zaXplKTsKKwlsZTE2X2FkZF9jcHUoJnhoLT54aF9uYW1lX3ZhbHVlX2xlbiwgc2l6ZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X2hhbmRsZV9qb3VybmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsCisJCQkJCSAgICAgdTE2IGJoX251bSkKK3sKKwlpbnQgcmV0ID0gMCwgb2ZmLCBibG9ja19vZmY7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSA9IHhzLT5oZXJlOworCisJLyoKKwkgKiBGaXJzdCBjYWxjdWxhdGUgYWxsIHRoZSBibG9ja3Mgd2Ugc2hvdWxkIGpvdXJuYWxfYWNjZXNzCisJICogYW5kIGpvdXJuYWxfZGlydHkuIFRoZSBmaXJzdCBibG9jayBzaG91bGQgYWx3YXlzIGJlIHRvdWNoZWQuCisJICovCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoc1swXSk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJLyogY2FsYyB0aGUgZGF0YS4gKi8KKwlvZmYgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpOworCWJsb2NrX29mZiA9IG9mZiA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmhzW2Jsb2NrX29mZl0pOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTZXQgdGhlIHhhdHRyIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgYnVja2V0LgorICogVGhlIGJ1Y2tldCBpcyBpbmRpY2F0ZWQgYnkgeHMtPmJ1Y2tldCBhbmQgaXQgc2hvdWxkIGhhdmUgdGhlIGVub3VnaAorICogc3BhY2UgZm9yIHRoZSB4YXR0ciBpbnNlcnRpb24uCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCQkgICB1MzIgbmFtZV9oYXNoLAorCQkJCQkgICBpbnQgbG9jYWwpCit7CisJaW50IGksIHJldDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwltbG9nKDAsICJTZXQgeGF0dHIgZW50cnkgbGVuID0gJWx1IGluZGV4ID0gJWQgaW4gYnVja2V0ICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyl4aS0+dmFsdWVfbGVuLCB4aS0+bmFtZV9pbmRleCwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpeHMtPmJ1Y2tldC5iaHNbMF0tPmJfYmxvY2tucik7CisKKwlpZiAoIXhzLT5idWNrZXQuYmhzWzFdKSB7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLAorCQkJCQl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yICsgMSwKKwkJCQkJYmxrX3Blcl9idWNrZXQgLSAxLCAmeHMtPmJ1Y2tldC5iaHNbMV0sCisJCQkJCU9DRlMyX0JIX0NBQ0hFRCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBibGtfcGVyX2J1Y2tldCk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJaGFuZGxlID0gTlVMTDsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+YnVja2V0LmJoc1tpXSwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlvY2ZzMl94YXR0cl9zZXRfZW50cnlfbm9ybWFsKGlub2RlLCB4aSwgeHMsIG5hbWVfaGFzaCwgbG9jYWwpOworCisJLypPbmx5IGRpcnR5IHRoZSBibG9ja3Mgd2UgaGF2ZSB0b3VjaGVkIGluIHNldCB4YXR0ci4gKi8KKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfaGFuZGxlX2pvdXJuYWwoaW5vZGUsIGhhbmRsZSwgeHMsCisJCQkJCQl4cy0+YnVja2V0LmJocywgYmxrX3Blcl9idWNrZXQpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKK291dDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl92YWx1ZV91cGRhdGVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICp4ZV9iaCwKKwkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUsCisJCQkJCSB1NjQgbmV3X3NpemUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgMSk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeGVfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXhlLT54ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlNjQobmV3X3NpemUpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhlX2JoKTsKKwlpZiAocmV0IDwgMCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRydW5jYXRlIHRoZSBzcGVjaWZpZWQgeGVfb2ZmIGVudHJ5IGluIHhhdHRyIGJ1Y2tldC4KKyAqIGJ1Y2tldCBpcyBpbmRpY2F0ZWQgYnkgaGVhZGVyX2JoIGFuZCBsZW4gaXMgdGhlIG5ldyBsZW5ndGguCisgKiBCb3RoIHRoZSBvY2ZzMl94YXR0cl92YWx1ZV9yb290IGFuZCB0aGUgZW50cnkgd2lsbCBiZSB1cGRhdGVkIGhlcmUuCisgKgorICogQ29weSB0aGUgbmV3IHVwZGF0ZWQgeGUgYW5kIHhlX3ZhbHVlX3Jvb3QgdG8gbmV3X3hlIGFuZCBuZXdfeHYgaWYgbmVlZGVkLgorICovCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZGVyX2JoLAorCQkJCQkgICAgIGludCB4ZV9vZmYsCisJCQkJCSAgICAgaW50IGxlbikKK3sKKwlpbnQgcmV0LCBvZmZzZXQ7CisJdTY0IHZhbHVlX2JsazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnZhbHVlX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHY7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9CisJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWhlYWRlcl9iaC0+Yl9kYXRhOworCXNpemVfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisKKwl4ZSA9ICZ4aC0+eGhfZW50cmllc1t4ZV9vZmZdOworCisJQlVHX09OKCF4ZSB8fCBvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpOworCisJb2Zmc2V0ID0gbGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KSArCisJCSBPQ0ZTMl9YQVRUUl9TSVpFKHhlLT54ZV9uYW1lX2xlbik7CisKKwl2YWx1ZV9ibGsgPSBvZmZzZXQgLyBibG9ja3NpemU7CisKKwkvKiBXZSBkb24ndCBhbGxvdyBvY2ZzMl94YXR0cl92YWx1ZSB0byBiZSBzdG9yZWQgaW4gZGlmZmVyZW50IGJsb2NrLiAqLworCUJVR19PTih2YWx1ZV9ibGsgIT0gKG9mZnNldCArIE9DRlMyX1hBVFRSX1JPT1RfU0laRSAtIDEpIC8gYmxvY2tzaXplKTsKKwl2YWx1ZV9ibGsgKz0gaGVhZGVyX2JoLT5iX2Jsb2NrbnI7CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCB2YWx1ZV9ibGssICZ2YWx1ZV9iaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopCisJCSh2YWx1ZV9iaC0+Yl9kYXRhICsgb2Zmc2V0ICUgYmxvY2tzaXplKTsKKworCW1sb2coMCwgInRydW5jYXRlICV1IGluIHhhdHRyIGJ1Y2tldCAlbGx1IHRvICVkIGJ5dGVzLlxuIiwKKwkgICAgIHhlX29mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZyloZWFkZXJfYmgtPmJfYmxvY2tuciwgbGVuKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShpbm9kZSwgdmFsdWVfYmgsIHh2LCBsZW4pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV91cGRhdGVfc2l6ZShpbm9kZSwgaGVhZGVyX2JoLCB4ZSwgbGVuKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJYnJlbHNlKHZhbHVlX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZV94cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCQlpbnQgbGVuKQoreworCWludCByZXQsIG9mZnNldDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlID0geHMtPmhlcmU7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXhzLT5iYXNlOworCisJQlVHX09OKCF4cy0+YnVja2V0LmJoc1swXSB8fCAheGUgfHwgb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKTsKKworCW9mZnNldCA9IHhlIC0geGgtPnhoX2VudHJpZXM7CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlKGlub2RlLCB4cy0+YnVja2V0LmJoc1swXSwKKwkJCQkJCW9mZnNldCwgbGVuKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF9zZXRfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCQljaGFyICp2YWwsCisJCQkJCQlpbnQgdmFsdWVfbGVuKQoreworCWludCBvZmZzZXQ7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2OworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSB4cy0+aGVyZTsKKworCUJVR19PTigheHMtPmJhc2UgfHwgIXhlIHx8IG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSk7CisKKwlvZmZzZXQgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpICsKKwkJIE9DRlMyX1hBVFRSX1NJWkUoeGUtPnhlX25hbWVfbGVuKTsKKworCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopKHhzLT5iYXNlICsgb2Zmc2V0KTsKKworCXJldHVybiBfX29jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4diwgdmFsLCB2YWx1ZV9sZW4pOworfQorCitzdGF0aWMgaW50IG9jZnMyX3JtX3hhdHRyX2NsdXN0ZXIoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKKwkJCQkgIHU2NCBibGtubywKKwkJCQkgIHUzMiBjcG9zLAorCQkJCSAgdTMyIGxlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXJvb3RfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgZGVhbGxvYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CisKKwlvY2ZzMl9pbml0X3hhdHRyX3RyZWVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgcm9vdF9iaCk7CisKKwlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmZGVhbGxvYyk7CisKKwltbG9nKDAsICJybSB4YXR0ciBleHRlbnQgcmVjIGF0ICV1IGxlbiA9ICV1LCBzdGFydCBmcm9tICVsbHVcbiIsCisJICAgICBjcG9zLCBsZW4sICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOworCisJb2NmczJfcmVtb3ZlX3hhdHRyX2NsdXN0ZXJzX2Zyb21fY2FjaGUoaW5vZGUsIGJsa25vLCBsZW4pOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIDAsIDEsIE5VTEwsICZtZXRhX2FjKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAob2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKG9zYikpIHsKKwkJcmV0ID0gX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2cob3NiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9SRU1PVkVfRVhURU5UX0NSRURJVFMpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVtb3ZlX2V4dGVudChpbm9kZSwgJmV0LCBjcG9zLCBsZW4sIGhhbmRsZSwgbWV0YV9hYywKKwkJCQkgICZkZWFsbG9jKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCWxlMzJfYWRkX2NwdSgmeGItPnhiX2F0dHJzLnhiX3Jvb3QueHRfY2x1c3RlcnMsIC1sZW4pOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHJvb3RfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwgYmxrbm8sIGxlbik7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CisKKwltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmZGVhbGxvYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl9idWNrZXRfcmVtb3ZlX3hzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IHhzLT5idWNrZXQueGg7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsYXN0ID0gJnhoLT54aF9lbnRyaWVzWworCQkJCQkJbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KSAtIDFdOworCWludCByZXQgPSAwOworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoKE9DRlMyX1NCKGlub2RlLT5pX3NiKSksIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT5idWNrZXQuYmhzWzBdLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCS8qIFJlbW92ZSB0aGUgb2xkIGVudHJ5LiAqLworCW1lbW1vdmUoeHMtPmhlcmUsIHhzLT5oZXJlICsgMSwKKwkJKHZvaWQgKilsYXN0IC0gKHZvaWQgKil4cy0+aGVyZSk7CisJbWVtc2V0KGxhc3QsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKKwlsZTE2X2FkZF9jcHUoJnhoLT54aF9jb3VudCwgLTEpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT5idWNrZXQuYmhzWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJbWxvZ19lcnJubyhyZXQpOworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOworfQorCisvKgorICogU2V0IHRoZSB4YXR0ciBuYW1lL3ZhbHVlIGluIHRoZSBidWNrZXQgc3BlY2lmaWVkIGluIHhzLgorICoKKyAqIEFzIHRoZSBuZXcgdmFsdWUgaW4geGkgbWF5IGJlIHN0b3JlZCBpbiB0aGUgYnVja2V0IG9yIGluIGFuIG91dHNpZGUgY2x1c3RlciwKKyAqIHdlIGRpdmlkZSB0aGUgd2hvbGUgcHJvY2VzcyBpbnRvIDMgc3RlcHM6CisgKiAxLiBpbnNlcnQgbmFtZS92YWx1ZSBpbiB0aGUgYnVja2V0KG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbl9idWNrZXQpCisgKiAyLiB0cnVuY2F0ZSBvZiB0aGUgb3V0c2lkZSBjbHVzdGVyKG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZV94cykKKyAqIDMuIFNldCB0aGUgdmFsdWUgdG8gdGhlIG91dHNpZGUgY2x1c3RlcihvY2ZzMl94YXR0cl9idWNrZXRfc2V0X3ZhbHVlX291dHNpZGUpCisgKiA0LiBJZiB0aGUgY2x1c3RlcnMgZm9yIHRoZSBuZXcgb3V0c2lkZSB2YWx1ZSBjYW4ndCBiZSBhbGxvY2F0ZWQsIHdlIG5lZWQKKyAqICAgIHRvIGZyZWUgdGhlIHhhdHRyIHdlIGFsbG9jYXRlZCBpbiBzZXQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2luX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJaW50IHJldCwgbG9jYWwgPSAxOworCXNpemVfdCB2YWx1ZV9sZW47CisJY2hhciAqdmFsID0gKGNoYXIgKil4aS0+dmFsdWU7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSA9IHhzLT5oZXJlOworCXUzMiBuYW1lX2hhc2ggPSBvY2ZzMl94YXR0cl9uYW1lX2hhc2goaW5vZGUsIHhpLT5uYW1lLAorCQkJCQkgICAgICBzdHJsZW4oeGktPm5hbWUpKTsKKworCWlmICgheHMtPm5vdF9mb3VuZCAmJiAhb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKSB7CisJCS8qCisJCSAqIFdlIG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHhhdHRyIHN0b3JhZ2UgZmlyc3QuCisJCSAqCisJCSAqIElmIGJvdGggdGhlIG9sZCBhbmQgbmV3IHZhbHVlIGFyZSBzdG9yZWQgdG8KKwkJICogb3V0c2lkZSBibG9jaywgd2Ugb25seSBuZWVkIHRvIHRydW5jYXRlCisJCSAqIHRoZSBzdG9yYWdlIGFuZCB0aGVuIHNldCB0aGUgdmFsdWUgb3V0c2lkZS4KKwkJICoKKwkJICogSWYgdGhlIG5ldyB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIHdpdGhpbiBibG9jaywKKwkJICogd2Ugc2hvdWxkIGZyZWUgYWxsIHRoZSBvdXRzaWRlIGJsb2NrIGZpcnN0IGFuZAorCQkgKiB0aGUgbW9kaWZpY2F0aW9uIHRvIHRoZSB4YXR0ciBibG9jayB3aWxsIGJlIGRvbmUKKwkJICogYnkgZm9sbG93aW5nIHN0ZXBzLgorCQkgKi8KKwkJaWYgKHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkKKwkJCXZhbHVlX2xlbiA9IHhpLT52YWx1ZV9sZW47CisJCWVsc2UKKwkJCXZhbHVlX2xlbiA9IDA7CisKKwkJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlX3hzKGlub2RlLCB4cywKKwkJCQkJCQkgICB2YWx1ZV9sZW4pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHZhbHVlX2xlbikKKwkJCWdvdG8gc2V0X3ZhbHVlX291dHNpZGU7CisJfQorCisJdmFsdWVfbGVuID0geGktPnZhbHVlX2xlbjsKKwkvKiBTbyB3ZSBoYXZlIHRvIGhhbmRsZSB0aGUgaW5zaWRlIGJsb2NrIGNoYW5nZSBub3cuICovCisJaWYgKHZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCS8qCisJCSAqIElmIHRoZSBuZXcgdmFsdWUgd2lsbCBiZSBzdG9yZWQgb3V0c2lkZSBvZiBibG9jaywKKwkJICogaW5pdGFsaXplIGEgbmV3IGVtcHR5IHZhbHVlIHJvb3QgYW5kIGluc2VydCBpdCBmaXJzdC4KKwkJICovCisJCWxvY2FsID0gMDsKKwkJeGktPnZhbHVlID0gJmRlZl94djsKKwkJeGktPnZhbHVlX2xlbiA9IE9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwl9CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5fYnVja2V0KGlub2RlLCB4aSwgeHMsIG5hbWVfaGFzaCwgbG9jYWwpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodmFsdWVfbGVuIDw9IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKQorCQlnb3RvIG91dDsKKworCS8qIGFsbG9jYXRlIHRoZSBzcGFjZSBub3cgZm9yIHRoZSBvdXRzaWRlIGJsb2NrIHN0b3JhZ2UuICovCisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlX3hzKGlub2RlLCB4cywKKwkJCQkJCSAgIHZhbHVlX2xlbik7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisKKwkJaWYgKHhzLT5ub3RfZm91bmQpIHsKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggY2x1c3RlcnMgZm9yIG91dHNpZGUKKwkJCSAqIHN0b3JhZ2UgYW5kIHdlIGhhdmUgYWxsb2NhdGVkIHhhdHRyIGFscmVhZHksCisJCQkgKiBzbyBuZWVkIHRvIHJlbW92ZSBpdC4KKwkJCSAqLworCQkJb2NmczJfeGF0dHJfYnVja2V0X3JlbW92ZV94cyhpbm9kZSwgeHMpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworc2V0X3ZhbHVlX291dHNpZGU6CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4cywgdmFsLCB2YWx1ZV9sZW4pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIGNoZWNrIHdoZXRoZXIgdGhlIHhhdHRyIGJ1Y2tldCBpcyBmaWxsZWQgdXAgd2l0aCB0aGUgc2FtZSBoYXNoIHZhbHVlLiAqLworc3RhdGljIGludCBvY2ZzMl9jaGVja194YXR0cl9idWNrZXRfY29sbGlzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCkKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IGJ1Y2tldC0+eGg7CisKKwlpZiAoeGgtPnhoX2VudHJpZXNbbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KSAtIDFdLnhlX25hbWVfaGFzaCA9PQorCSAgICB4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpIHsKKwkJbWxvZyhNTF9FUlJPUiwgIlRvbyBtdWNoIGhhc2ggY29sbGlzaW9uIGluIHhhdHRyIGJ1Y2tldCAlbGx1LCAiCisJCSAgICAgImhhc2ggPSAldVxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldC0+YmhzWzBdLT5iX2Jsb2NrbnIsCisJCSAgICAgbGUzMl90b19jcHUoeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKSk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlOworCXUxNiBjb3VudCwgaGVhZGVyX3NpemUsIHhoX2ZyZWVfc3RhcnQ7CisJaW50IGksIGZyZWUsIG1heF9mcmVlLCBuZWVkLCBvbGQ7CisJc2l6ZV90IHZhbHVlX3NpemUgPSAwLCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CisJc2l6ZV90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgcmV0LCBhbGxvY2F0aW9uID0gMDsKKwl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisKKwltbG9nX2VudHJ5KCJTZXQgeGF0dHIgJXMgaW4geGF0dHIgaW5kZXggYmxvY2tcbiIsIHhpLT5uYW1lKTsKKwordHJ5X2FnYWluOgorCXhoID0geHMtPmhlYWRlcjsKKwljb3VudCA9IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCk7CisJeGhfZnJlZV9zdGFydCA9IGxlMTZfdG9fY3B1KHhoLT54aF9mcmVlX3N0YXJ0KTsKKwloZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyKSArCisJCQljb3VudCAqIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpOworCW1heF9mcmVlID0gT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgLQorCQlsZTE2X3RvX2NwdSh4aC0+eGhfbmFtZV92YWx1ZV9sZW4pIC0gaGVhZGVyX3NpemU7CisKKwltbG9nX2J1Z19vbl9tc2coaGVhZGVyX3NpemUgPiBibG9ja3NpemUsICJidWNrZXQgJWxsdSBoYXMgaGVhZGVyIHNpemUgIgorCQkJIm9mICV1IHdoaWNoIGV4Y2VlZCBibG9jayBzaXplXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yLAorCQkJaGVhZGVyX3NpemUpOworCisJaWYgKHhpLT52YWx1ZSAmJiB4aS0+dmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpCisJCXZhbHVlX3NpemUgPSBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisJZWxzZSBpZiAoeGktPnZhbHVlKQorCQl2YWx1ZV9zaXplID0gT0NGUzJfWEFUVFJfU0laRSh4aS0+dmFsdWVfbGVuKTsKKworCWlmICh4cy0+bm90X2ZvdW5kKQorCQluZWVkID0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkgKworCQkJT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyB2YWx1ZV9zaXplOworCWVsc2UgeworCQluZWVkID0gdmFsdWVfc2l6ZSArIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pOworCisJCS8qCisJCSAqIFdlIG9ubHkgcmVwbGFjZSB0aGUgb2xkIHZhbHVlIGlmIHRoZSBuZXcgbGVuZ3RoIGlzIHNtYWxsZXIKKwkJICogdGhhbiB0aGUgb2xkIG9uZS4gT3RoZXJ3aXNlIHdlIHdpbGwgYWxsb2NhdGUgbmV3IHNwYWNlIGluIHRoZQorCQkgKiBidWNrZXQgdG8gc3RvcmUgaXQuCisJCSAqLworCQl4ZSA9IHhzLT5oZXJlOworCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKQorCQkJb2xkID0gT0NGUzJfWEFUVFJfU0laRShsZTY0X3RvX2NwdSh4ZS0+eGVfdmFsdWVfc2l6ZSkpOworCQllbHNlCisJCQlvbGQgPSBPQ0ZTMl9YQVRUUl9TSVpFKE9DRlMyX1hBVFRSX1JPT1RfU0laRSk7CisKKwkJaWYgKG9sZCA+PSB2YWx1ZV9zaXplKQorCQkJbmVlZCA9IDA7CisJfQorCisJZnJlZSA9IHhoX2ZyZWVfc3RhcnQgLSBoZWFkZXJfc2l6ZTsKKwkvKgorCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBuZXcgbmFtZS92YWx1ZSBwYWlyCisJICogY2FuIGV4aXN0IGluIHRoZSBzYW1lIGJsb2NrLgorCSAqLworCWlmICh4aF9mcmVlX3N0YXJ0ICUgYmxvY2tzaXplIDwgbmVlZCkKKwkJZnJlZSAtPSB4aF9mcmVlX3N0YXJ0ICUgYmxvY2tzaXplOworCisJbWxvZygwLCAieHMtPm5vdF9mb3VuZCA9ICVkLCBpbiB4YXR0ciBidWNrZXQgJWxsdTogZnJlZSA9ICVkLCAiCisJICAgICAibmVlZCA9ICVkLCBtYXhfZnJlZSA9ICVkLCB4aF9mcmVlX3N0YXJ0ID0gJXUsIHhoX25hbWVfdmFsdWVfbGVuID0iCisJICAgICAiICV1XG4iLCB4cy0+bm90X2ZvdW5kLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yLAorCSAgICAgZnJlZSwgbmVlZCwgbWF4X2ZyZWUsIGxlMTZfdG9fY3B1KHhoLT54aF9mcmVlX3N0YXJ0KSwKKwkgICAgIGxlMTZfdG9fY3B1KHhoLT54aF9uYW1lX3ZhbHVlX2xlbikpOworCisJaWYgKGZyZWUgPCBuZWVkIHx8IGNvdW50ID09IG9jZnMyX3hhdHRyX21heF94ZV9pbl9idWNrZXQoaW5vZGUtPmlfc2IpKSB7CisJCWlmIChuZWVkIDw9IG1heF9mcmVlICYmCisJCSAgICBjb3VudCA8IG9jZnMyX3hhdHRyX21heF94ZV9pbl9idWNrZXQoaW5vZGUtPmlfc2IpKSB7CisJCQkvKgorCQkJICogV2UgY2FuIGNyZWF0ZSB0aGUgc3BhY2UgYnkgZGVmcmFnbWVudC4gU2luY2Ugb25seSB0aGUKKwkJCSAqIG5hbWUvdmFsdWUgd2lsbCBiZSBtb3ZlZCwgdGhlIHhlIHNob3VsZG4ndCBiZSBjaGFuZ2VkCisJCQkgKiBpbiB4cy4KKwkJCSAqLworCQkJcmV0ID0gb2NmczJfZGVmcmFnX3hhdHRyX2J1Y2tldChpbm9kZSwgJnhzLT5idWNrZXQpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJeGhfZnJlZV9zdGFydCA9IGxlMTZfdG9fY3B1KHhoLT54aF9mcmVlX3N0YXJ0KTsKKwkJCWZyZWUgPSB4aF9mcmVlX3N0YXJ0IC0gaGVhZGVyX3NpemU7CisJCQlpZiAoeGhfZnJlZV9zdGFydCAlIGJsb2Nrc2l6ZSA8IG5lZWQpCisJCQkJZnJlZSAtPSB4aF9mcmVlX3N0YXJ0ICUgYmxvY2tzaXplOworCisJCQlpZiAoZnJlZSA+PSBuZWVkKQorCQkJCWdvdG8geGF0dHJfc2V0OworCisJCQltbG9nKDAsICJDYW4ndCBnZXQgZW5vdWdoIHNwYWNlIGZvciB4YXR0ciBpbnNlcnQgYnkgIgorCQkJICAgICAiZGVmcmFnbWVudC4gTmVlZCAldSBieXRlcywgYnV0IHdlIGhhdmUgJWQsIHNvICIKKwkJCSAgICAgImFsbG9jYXRlIG5ldyBidWNrZXQgZm9yIGl0LlxuIiwgbmVlZCwgZnJlZSk7CisJCX0KKworCQkvKgorCQkgKiBXZSBoYXZlIHRvIGFkZCBuZXcgYnVja2V0cyBvciBjbHVzdGVycyBhbmQgb25lCisJCSAqIGFsbG9jYXRpb24gc2hvdWxkIGxlYXZlIHVzIGVub3VnaCBzcGFjZSBmb3IgaW5zZXJ0LgorCQkgKi8KKwkJQlVHX09OKGFsbG9jYXRpb24pOworCisJCS8qCisJCSAqIFdlIGRvIG5vdCBhbGxvdyBmb3Igb3ZlcmxhcHBpbmcgcmFuZ2VzIGJldHdlZW4gYnVja2V0cy4gQW5kCisJCSAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2xsaXNpb25zIHdlIHdpbGwgYWxsb3cgZm9yIHRoZW4gaXMKKwkJICogb25lIGJ1Y2tldCdzIHdvcnRoLCBzbyBjaGVjayBpdCBoZXJlIHdoZXRoZXIgd2UgbmVlZCB0bworCQkgKiBhZGQgYSBuZXcgYnVja2V0IGZvciB0aGUgaW5zZXJ0LgorCQkgKi8KKwkJcmV0ID0gb2NmczJfY2hlY2tfeGF0dHJfYnVja2V0X2NvbGxpc2lvbihpbm9kZSwgJnhzLT5idWNrZXQpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX2FkZF9uZXdfeGF0dHJfYnVja2V0KGlub2RlLAorCQkJCQkJIHhzLT54YXR0cl9iaCwKKwkJCQkJCSB4cy0+YnVja2V0LmJoc1swXSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCisJCQlicmVsc2UoeHMtPmJ1Y2tldC5iaHNbaV0pOworCisJCW1lbXNldCgmeHMtPmJ1Y2tldCwgMCwgc2l6ZW9mKHhzLT5idWNrZXQpKTsKKworCQlyZXQgPSBvY2ZzMl94YXR0cl9pbmRleF9ibG9ja19maW5kKGlub2RlLCB4cy0+eGF0dHJfYmgsCisJCQkJCQkgICB4aS0+bmFtZV9pbmRleCwKKwkJCQkJCSAgIHhpLT5uYW1lLCB4cyk7CisJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9EQVRBKQorCQkJZ290byBvdXQ7CisJCXhzLT5ub3RfZm91bmQgPSByZXQ7CisJCWFsbG9jYXRpb24gPSAxOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKK3hhdHRyX3NldDoKKwlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfaW5fYnVja2V0KGlub2RlLCB4aSwgeHMpOworb3V0OgorCW1sb2dfZXhpdChyZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZGVsZXRlX3hhdHRyX2luX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQsCisJCQkJCXZvaWQgKnBhcmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBidWNrZXQtPnhoOworCXUxNiBpOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KTsgaSsrKSB7CisJCXhlID0gJnhoLT54aF9lbnRyaWVzW2ldOworCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlKGlub2RlLAorCQkJCQkJCWJ1Y2tldC0+YmhzWzBdLAorCQkJCQkJCWksIDApOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZGVsZXRlX3hhdHRyX2luZGV4X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4Yl9iaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0KKwkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKil4Yl9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmeGItPnhiX2F0dHJzLnhiX3Jvb3QueHRfbGlzdDsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgbmFtZV9oYXNoID0gVUlOVF9NQVgsIGVfY3BvcywgbnVtX2NsdXN0ZXJzOworCXU2NCBwX2Jsa25vOworCisJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDApCisJCXJldHVybiAwOworCisJd2hpbGUgKG5hbWVfaGFzaCA+IDApIHsKKwkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X3JlYyhpbm9kZSwgbmFtZV9oYXNoLCAmcF9ibGtubywKKwkJCQkJICAmZV9jcG9zLCAmbnVtX2NsdXN0ZXJzLCBlbCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfaXRlcmF0ZV94YXR0cl9idWNrZXRzKGlub2RlLCBwX2Jsa25vLCBudW1fY2x1c3RlcnMsCisJCQkJCQkgIG9jZnMyX2RlbGV0ZV94YXR0cl9pbl9idWNrZXQsCisJCQkJCQkgIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX3JtX3hhdHRyX2NsdXN0ZXIoaW5vZGUsIHhiX2JoLAorCQkJCQkgICAgIHBfYmxrbm8sIGVfY3BvcywgbnVtX2NsdXN0ZXJzKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZV9jcG9zID09IDApCisJCQlicmVhazsKKworCQluYW1lX2hhc2ggPSBlX2Nwb3MgLSAxOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAndHJ1c3RlZCcgYXR0cmlidXRlcyBzdXBwb3J0CisgKi8KKworI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCisKK3N0YXRpYyBzaXplX3Qgb2NmczJfeGF0dHJfdHJ1c3RlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsCisJCQkJICAgICAgIHNpemVfdCBsaXN0X3NpemUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkgLSAxOworCWNvbnN0IHNpemVfdCB0b3RhbF9sZW4gPSBwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxOworCisJaWYgKGxpc3QgJiYgdG90YWxfbGVuIDw9IGxpc3Rfc2l6ZSkgeworCQltZW1jcHkobGlzdCwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCArIHByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl90cnVzdGVkX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG9jZnMyX3hhdHRyX2dldChpbm9kZSwgT0NGUzJfWEFUVFJfSU5ERVhfVFJVU1RFRCwgbmFtZSwKKwkJCSAgICAgICBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3RydXN0ZWRfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gb2NmczJfeGF0dHJfc2V0KGlub2RlLCBPQ0ZTMl9YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLCB2YWx1ZSwKKwkJCSAgICAgICBzaXplLCBmbGFncyk7Cit9CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX3RydXN0ZWRfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJLmxpc3QJPSBvY2ZzMl94YXR0cl90cnVzdGVkX2xpc3QsCisJLmdldAk9IG9jZnMyX3hhdHRyX3RydXN0ZWRfZ2V0LAorCS5zZXQJPSBvY2ZzMl94YXR0cl90cnVzdGVkX3NldCwKK307CisKKworLyoKKyAqICd1c2VyJyBhdHRyaWJ1dGVzIHN1cHBvcnQKKyAqLworCisjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYICJ1c2VyLiIKKworc3RhdGljIHNpemVfdCBvY2ZzMl94YXR0cl91c2VyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwKKwkJCQkgICAgc2l6ZV90IGxpc3Rfc2l6ZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSAtIDE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwlpZiAob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX05PVVNFUlhBVFRSKQorCQlyZXR1cm4gMDsKKworCWlmIChsaXN0ICYmIHRvdGFsX2xlbiA8PSBsaXN0X3NpemUpIHsKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX1VTRVJfUFJFRklYLCBwcmVmaXhfbGVuKTsKKwkJbWVtY3B5KGxpc3QgKyBwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfdXNlcl9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQl2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBvY2ZzMl94YXR0cl9nZXQoaW5vZGUsIE9DRlMyX1hBVFRSX0lOREVYX1VTRVIsIG5hbWUsCisJCQkgICAgICAgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl91c2VyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCWNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIG9jZnMyX3hhdHRyX3NldChpbm9kZSwgT0NGUzJfWEFUVFJfSU5ERVhfVVNFUiwgbmFtZSwgdmFsdWUsCisJCQkgICAgICAgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl91c2VyX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1VTRVJfUFJFRklYLAorCS5saXN0CT0gb2NmczJfeGF0dHJfdXNlcl9saXN0LAorCS5nZXQJPSBvY2ZzMl94YXR0cl91c2VyX2dldCwKKwkuc2V0CT0gb2NmczJfeGF0dHJfdXNlcl9zZXQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIveGF0dHIuaCBiL2ZzL29jZnMyL3hhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1YzdjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL3hhdHRyLmgKQEAgLTAsMCArMSw2OCBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0KKyAqIHZpbTogbm9leHBhbmR0YWIgc3c9OCB0cz04IHN0cz0wOgorICoKKyAqIHhhdHRyLmgKKyAqCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgT0NGUzJfWEFUVFJfSAorI2RlZmluZSBPQ0ZTMl9YQVRUUl9ICisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKworZW51bSBvY2ZzMl94YXR0cl90eXBlIHsKKwlPQ0ZTMl9YQVRUUl9JTkRFWF9VU0VSID0gMSwKKwlPQ0ZTMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTLAorCU9DRlMyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxULAorCU9DRlMyX1hBVFRSX0lOREVYX1RSVVNURUQsCisJT0NGUzJfWEFUVFJfSU5ERVhfU0VDVVJJVFksCisJT0NGUzJfWEFUVFJfTUFYCit9OworCitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfdXNlcl9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX3RydXN0ZWRfaGFuZGxlcjsKKworZXh0ZXJuIHNzaXplX3Qgb2NmczJfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIGludCBvY2ZzMl94YXR0cl9nZXQoc3RydWN0IGlub2RlICosIGludCwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gaW50IG9jZnMyX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwKKwkJCSAgIHNpemVfdCwgaW50KTsKK2V4dGVybiBpbnQgb2NmczJfeGF0dHJfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvY2ZzMl94YXR0cl9oYW5kbGVyc1tdOworCitzdGF0aWMgaW5saW5lIHUxNiBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCXJldHVybiAoMSA8PCBvc2ItPnNfY2x1c3RlcnNpemVfYml0cykgLyBPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRTsKK30KKworc3RhdGljIGlubGluZSB1MTYgb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgLyAoMSA8PCBzYi0+c19ibG9ja3NpemVfYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG9jZnMyX3hhdHRyX21heF94ZV9pbl9idWNrZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwl1MTYgbGVuID0gc2ItPnNfYmxvY2tzaXplIC0KKwkJIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIsIHhoX2VudHJpZXMpOworCisJcmV0dXJuIGxlbiAvIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpOworfQorI2VuZGlmIC8qIE9DRlMyX1hBVFRSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19taXNjLmMgYi9mcy9wcm9jL3Byb2NfbWlzYy5jCmluZGV4IDY2YzFhYjguLmI2NzVhNDkgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19taXNjLmMKKysrIGIvZnMvcHJvYy9wcm9jX21pc2MuYwpAQCAtNjgzLDYgKzY4Myw3IEBACiAJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7CiB9CiAKKyNpZmRlZiBDT05GSUdfRklMRV9MT0NLSU5HCiBzdGF0aWMgaW50IGxvY2tzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJcmV0dXJuIHNlcV9vcGVuKGZpbHAsICZsb2Nrc19zZXFfb3BlcmF0aW9ucyk7CkBAIC02OTQsNiArNjk1LDcgQEAKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKKyNlbmRpZiAvKiBDT05GSUdfRklMRV9MT0NLSU5HICovCiAKIHN0YXRpYyBpbnQgZXhlY2RvbWFpbnNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQpAQCAtODg3LDcgKzg4OSw5IEBACiAjaWZkZWYgQ09ORklHX1BSSU5USwogCXByb2NfY3JlYXRlKCJrbXNnIiwgU19JUlVTUiwgTlVMTCwgJnByb2Nfa21zZ19vcGVyYXRpb25zKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19GSUxFX0xPQ0tJTkcKIAlwcm9jX2NyZWF0ZSgibG9ja3MiLCAwLCBOVUxMLCAmcHJvY19sb2Nrc19vcGVyYXRpb25zKTsKKyNlbmRpZgogCXByb2NfY3JlYXRlKCJkZXZpY2VzIiwgMCwgTlVMTCwgJnByb2NfZGV2aW5mb19vcGVyYXRpb25zKTsKIAlwcm9jX2NyZWF0ZSgiY3B1aW5mbyIsIDAsIE5VTEwsICZwcm9jX2NwdWluZm9fb3BlcmF0aW9ucyk7CiAjaWZkZWYgQ09ORklHX0JMT0NLCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaHcuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlody5oCmluZGV4IGVjZjAwN2QuLjE0MTJiNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlody5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlody5oCkBAIC0zOSw3ICszOSw2IEBACiAjZGVmaW5lIE1BQ0hfSVNfVFQJKChhdGFyaV9tY2hfY29va2llID4+IDE2KSA9PSBBVEFSSV9NQ0hfVFQpCiAjZGVmaW5lIE1BQ0hfSVNfRkFMQ09OCSgoYXRhcmlfbWNoX2Nvb2tpZSA+PiAxNikgPT0gQVRBUklfTUNIX0ZBTENPTikKICNkZWZpbmUgTUFDSF9JU19NRURVU0EJKGF0YXJpX21jaF90eXBlID09IEFUQVJJX01BQ0hfTUVEVVNBKQotI2RlZmluZSBNQUNIX0lTX0hBREVTCShhdGFyaV9tY2hfdHlwZSA9PSBBVEFSSV9NQUNIX0hBREVTKQogI2RlZmluZSBNQUNIX0lTX0FCNDAJKGF0YXJpX21jaF90eXBlID09IEFUQVJJX01BQ0hfQUI0MCkKIAogLyogdmFsdWVzIGZvciBhdGFyaV9zd2l0Y2hlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tbTY4ay9kbWEtbWFwcGluZy5oCmluZGV4IDkxZjc5NDQuLjI2ZjUwNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2RtYS1tYXBwaW5nLmgKQEAgLTc0LDYgKzc0LDE0IEBACiBleHRlcm4gdm9pZCBkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwKIAkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJLyoganVzdCBzeW5jIGV2ZXJ5dGhpbmcgZm9yIG5vdyAqLworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgZG1hX2hhbmRsZSwgb2Zmc2V0ICsgc2l6ZSwgZGlyZWN0aW9uKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBoYW5kbGUsCiAJCQkJCSAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CkBAIC04NCw2ICs5MiwxNCBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAorCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCS8qIGp1c3Qgc3luYyBldmVyeXRoaW5nIGZvciBub3cgKi8KKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGRtYV9oYW5kbGUsIG9mZnNldCArIHNpemUsIGRpcmVjdGlvbik7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBoYW5kbGUpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2RtYS5oIGIvaW5jbHVkZS9hc20tbTY4ay9kbWEuaAppbmRleCBkMGM5ZTYxLi40MjQwZmJjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2RtYS5oCkBAIC0xMSwxMCArMTEsNiBAQAogZXh0ZXJuIGludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNvbnN0IGNoYXIgKiBkZXZpY2VfaWQpOwkvKiByZXNlcnZlIGEgRE1BIGNoYW5uZWwgKi8KIGV4dGVybiB2b2lkIGZyZWVfZG1hKHVuc2lnbmVkIGludCBkbWFucik7CS8qIHJlbGVhc2UgaXQgYWdhaW4gKi8KIAotI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiBpbnQgaXNhX2RtYV9icmlkZ2VfYnVnZ3k7Ci0jZWxzZQogI2RlZmluZSBpc2FfZG1hX2JyaWRnZV9idWdneSAgICAoMCkKLSNlbmRpZgogCiAjZW5kaWYgLyogX002OEtfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZW50cnkuaCBiL2luY2x1ZGUvYXNtLW02OGsvZW50cnkuaAppbmRleCBmOGY2YjE4Li41MjAyZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2VudHJ5LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9lbnRyeS5oCkBAIC0zMSw3ICszMSw3IEBACiAgKi8KIAogLyogdGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIHdoZW4gZW5hYmxpbmcgaW50ZXJydXB0cyAqLwotI2lmIGRlZmluZWQoTUFDSF9BVEFSSV9PTkxZKSAmJiAhZGVmaW5lZChDT05GSUdfSEFERVMpCisjaWYgZGVmaW5lZChNQUNIX0FUQVJJX09OTFkpCiAJLyogYmxvY2sgb3V0IEhTWU5DIG9uIHRoZSBhdGFyaSAqLwogI2RlZmluZSBBTExPV0lOVAkofjB4NDAwKQogI2RlZmluZQlNQVhfTk9JTlRfSVBMCTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvaW8uaCBiL2luY2x1ZGUvYXNtLW02OGsvaW8uaAppbmRleCA2NTcxODdmLi45ZTY3M2UzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9pby5oCkBAIC03LDE1ICs3LDEyIEBACiAgKiAgICAgICAgICAgIC0gYWRkZWQgc2tlbGV0b24gZm9yIEdHLUlJIGFuZCBBbWlnYSBQQ01DSUEKICAqIDIvMy8wMSBSWjogLSBtb3ZlZCBhIGZldyBtb3JlIGRlZnMgaW50byByYXdfaW8uaAogICoKLSAqIGluWC9vdXRYL3JlYWRYL3dyaXRlWCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IGRyaXZlciB1bmxlc3MgaXQgZG9lcwotICogSVNBIG9yIFBDSSBhY2Nlc3MuIE90aGVyIGRyaXZlcnMgc2hvdWxkIHVzZSBmdW5jdGlvbiBkZWZpbmVkIGluIHJhd19pby5oCisgKiBpblgvb3V0WCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IGRyaXZlciB1bmxlc3MgaXQgZG9lcworICogSVNBIGFjY2Vzcy4gT3RoZXIgZHJpdmVycyBzaG91bGQgdXNlIGZ1bmN0aW9uIGRlZmluZWQgaW4gcmF3X2lvLmgKICAqIG9yIGRlZmluZSBpdHMgb3duIG1hY3JvcyBvbiB0b3Agb2YgdGhlc2UuCiAgKgotICogICAgaW5YKCksb3V0WCgpICAgICAgICAgICAgICBhcmUgZm9yIFBDSSBhbmQgSVNBIEkvTwotICogICAgcmVhZFgoKSx3cml0ZVgoKSAgICAgICAgICBhcmUgZm9yIFBDSSBtZW1vcnkKKyAqICAgIGluWCgpLG91dFgoKSAgICAgICAgICAgICAgYXJlIGZvciBJU0EgSS9PCiAgKiAgICBpc2FfcmVhZFgoKSxpc2Ffd3JpdGVYKCkgIGFyZSBmb3IgSVNBIG1lbW9yeQotICoKLSAqIG1vdmVkIG1lbXtjcHksc2V0fV8qaW8gaW5zaWRlIENPTkZJR19QQ0kKICAqLwogCiAjaWZuZGVmIF9JT19ICkBAIC0yNTYsMTAgKzI1Myw3IEBACiAgICAgICAgKElTQV9TRVggPyByYXdfb3V0c2woaXNhX2l0bChwb3J0KSwgKHUzMiAqKShidWYpLCAobnIpKSA6ICBcCiAgICAgICAgICAgICAgICAgICByYXdfb3V0c3dfc3dhcHcoaXNhX2l0dyhwb3J0KSwgKHUxNiAqKShidWYpLCAobnIpPDwxKSkKIAotI2VuZGlmICAvKiBDT05GSUdfSVNBICovCiAKLQotI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgJiYgIWRlZmluZWQoQ09ORklHX1BDSSkKICNkZWZpbmUgaW5iICAgICBpc2FfaW5iCiAjZGVmaW5lIGluYl9wICAgaXNhX2luYl9wCiAjZGVmaW5lIG91dGIgICAgaXNhX291dGIKQEAgLTI4Miw1NSArMjc2LDkgQEAKICNkZWZpbmUgcmVhZHcgICBpc2FfcmVhZHcKICNkZWZpbmUgd3JpdGViICBpc2Ffd3JpdGViCiAjZGVmaW5lIHdyaXRldyAgaXNhX3dyaXRldwotI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNlbHNlICAvKiBDT05GSUdfSVNBICovCiAKLSNkZWZpbmUgcmVhZGwoYWRkcikgICAgICBpbl9sZTMyKGFkZHIpCi0jZGVmaW5lIHdyaXRlbCh2YWwsYWRkcikgb3V0X2xlMzIoKGFkZHIpLCh2YWwpKQotCi0vKiB0aG9zZSBjYW4gYmUgZGVmaW5lZCBmb3IgYm90aCBJU0EgYW5kIFBDSSAtIGl0IHdvbid0IHdvcmsgdGhvdWdoICovCi0jZGVmaW5lIHJlYWRiKGFkZHIpICAgICAgIGluXzgoYWRkcikKLSNkZWZpbmUgcmVhZHcoYWRkcikgICAgICAgaW5fbGUxNihhZGRyKQotI2RlZmluZSB3cml0ZWIodmFsLGFkZHIpICBvdXRfOCgoYWRkciksKHZhbCkpCi0jZGVmaW5lIHdyaXRldyh2YWwsYWRkcikgIG91dF9sZTE2KChhZGRyKSwodmFsKSkKLQotI2RlZmluZSByZWFkYl9yZWxheGVkKGFkZHIpIHJlYWRiKGFkZHIpCi0jZGVmaW5lIHJlYWR3X3JlbGF4ZWQoYWRkcikgcmVhZHcoYWRkcikKLSNkZWZpbmUgcmVhZGxfcmVsYXhlZChhZGRyKSByZWFkbChhZGRyKQotCi0jaWZuZGVmIENPTkZJR19JU0EKLSNkZWZpbmUgaW5iKHBvcnQpICAgICAgaW5fOChwb3J0KQotI2RlZmluZSBvdXRiKHZhbCxwb3J0KSBvdXRfOCgocG9ydCksKHZhbCkpCi0jZGVmaW5lIGludyhwb3J0KSAgICAgIGluX2xlMTYocG9ydCkKLSNkZWZpbmUgb3V0dyh2YWwscG9ydCkgb3V0X2xlMTYoKHBvcnQpLCh2YWwpKQotI2RlZmluZSBpbmwocG9ydCkgICAgICBpbl9sZTMyKHBvcnQpCi0jZGVmaW5lIG91dGwodmFsLHBvcnQpIG91dF9sZTMyKChwb3J0KSwodmFsKSkKLQotI2Vsc2UKLS8qCi0gKiBrZXJuZWwgd2l0aCBib3RoIElTQSBhbmQgUENJIGNvbXBpbGVkIGluLCB0aG9zZSBoYXZlCi0gKiBjb25mbGljdGluZyBkZWZzIGZvciBpbi9vdXQuIFNpbXBseSBjb25zaWRlciBwb3J0IDwgMTAyNAotICogSVNBIGFuZCBldmVyeXRoaW5nIGVsc2UgUENJLiByZWFkLHdyaXRlIG5vdCBkZWZpbmVkCi0gKiBpbiB0aGlzIGNhc2UKLSAqLwotI2RlZmluZSBpbmIocG9ydCkgKChwb3J0KTwxMDI0ID8gaXNhX2luYihwb3J0KSA6IGluXzgocG9ydCkpCi0jZGVmaW5lIGluYl9wKHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9pbmJfcChwb3J0KSA6IGluXzgocG9ydCkpCi0jZGVmaW5lIGludyhwb3J0KSAoKHBvcnQpPDEwMjQgPyBpc2FfaW53KHBvcnQpIDogaW5fbGUxNihwb3J0KSkKLSNkZWZpbmUgaW53X3AocG9ydCkgKChwb3J0KTwxMDI0ID8gaXNhX2lud19wKHBvcnQpIDogaW5fbGUxNihwb3J0KSkKLSNkZWZpbmUgaW5sKHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9pbmwocG9ydCkgOiBpbl9sZTMyKHBvcnQpKQotI2RlZmluZSBpbmxfcChwb3J0KSAoKHBvcnQpPDEwMjQgPyBpc2FfaW5sX3AocG9ydCkgOiBpbl9sZTMyKHBvcnQpKQotCi0jZGVmaW5lIG91dGIodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRiKCh2YWwpLChwb3J0KSkgOiBvdXRfOCgocG9ydCksKHZhbCkpKQotI2RlZmluZSBvdXRiX3AodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRiX3AoKHZhbCksKHBvcnQpKSA6IG91dF84KChwb3J0KSwodmFsKSkpCi0jZGVmaW5lIG91dHcodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXR3KCh2YWwpLChwb3J0KSkgOiBvdXRfbGUxNigocG9ydCksKHZhbCkpKQotI2RlZmluZSBvdXR3X3AodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXR3X3AoKHZhbCksKHBvcnQpKSA6IG91dF9sZTE2KChwb3J0KSwodmFsKSkpCi0jZGVmaW5lIG91dGwodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRsKCh2YWwpLChwb3J0KSkgOiBvdXRfbGUzMigocG9ydCksKHZhbCkpKQotI2RlZmluZSBvdXRsX3AodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRsX3AoKHZhbCksKHBvcnQpKSA6IG91dF9sZTMyKChwb3J0KSwodmFsKSkpCi0jZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfSVNBKSAmJiAhZGVmaW5lZChDT05GSUdfUENJKQogLyoKICAqIFdlIG5lZWQgdG8gZGVmaW5lIGR1bW15IGZ1bmN0aW9ucyBmb3IgR0VORVJJQ19JT01BUCBzdXBwb3J0LgogICovCkBAIC0zNTcsMTEgKzMwNSwxMSBAQAogI2RlZmluZSB3cml0ZWIodmFsLGFkZHIpIG91dF84KChhZGRyKSwodmFsKSkKICNkZWZpbmUgcmVhZHcoYWRkcikgICAgICBpbl9sZTE2KGFkZHIpCiAjZGVmaW5lIHdyaXRldyh2YWwsYWRkcikgb3V0X2xlMTYoKGFkZHIpLCh2YWwpKQotI2VuZGlmCi0jaWYgIWRlZmluZWQoQ09ORklHX1BDSSkKKworI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKwogI2RlZmluZSByZWFkbChhZGRyKSAgICAgIGluX2xlMzIoYWRkcikKICNkZWZpbmUgd3JpdGVsKHZhbCxhZGRyKSBvdXRfbGUzMigoYWRkciksKHZhbCkpCi0jZW5kaWYKIAogI2RlZmluZSBtbWlvd2IoKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oIGIvaW5jbHVkZS9hc20tbTY4ay9wY2kuaAppbmRleCA2NzhjYjBiLi40YWQwYWVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcGNpLmgKQEAgLTEsNTIgKzEsNyBAQAogI2lmbmRlZiBfQVNNX002OEtfUENJX0gKICNkZWZpbmUgX0FTTV9NNjhLX1BDSV9ICiAKLS8qCi0gKiBhc20tbTY4ay9wY2lfbTY4ay5oIC0gbTY4ayBzcGVjaWZpYyBQQ0kgZGVjbGFyYXRpb25zLgotICoKLSAqIFdyaXR0ZW4gYnkgV291dCBLbGFyZW4uCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotCi1zdHJ1Y3QgcGNpX29wczsKLQotLyoKLSAqIFN0cnVjdHVyZSB3aXRoIGhhcmR3YXJlIGRlcGVuZGVudCBpbmZvcm1hdGlvbiBhbmQgZnVuY3Rpb25zIG9mIHRoZQotICogUENJIGJ1cy4KLSAqLwotCi1zdHJ1Y3QgcGNpX2J1c19pbmZvCi17Ci0JLyoKLQkgKiBSZXNvdXJjZXMgb2YgdGhlIFBDSSBidXMuCi0JICovCi0KLQlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3NwYWNlOwotCXN0cnVjdCByZXNvdXJjZSBpb19zcGFjZTsKLQotCS8qCi0JICogU3lzdGVtIGRlcGVuZGVudCBmdW5jdGlvbnMuCi0JICovCi0KLQlzdHJ1Y3QgcGNpX29wcyAqbTY4a19wY2lfb3BzOwotCi0Jdm9pZCAoKmZpeHVwKShpbnQgcGNpX21vZGlmeSk7Ci0Jdm9pZCAoKmNvbmZfZGV2aWNlKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLX07Ci0KLSNkZWZpbmUgcGNpYmlvc19hc3NpZ25fYWxsX2J1c3NlcygpCTAKLSNkZWZpbmUgcGNpYmlvc19zY2FuX2FsbF9mbnMoYSwgYikJMAotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKLXsKLQkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwotfQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS1kbWEtY29tcGF0Lmg+CiAKIC8qIFRoZSBQQ0kgYWRkcmVzcyBzcGFjZSBkb2VzIGVxdWFsIHRoZSBwaHlzaWNhbCBtZW1vcnkKICAqIGFkZHJlc3Mgc3BhY2UuICBUaGUgbmV0d29ya2luZyBhbmQgYmxvY2sgZGV2aWNlIGxheWVycyB1c2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdmlydGNvbnZlcnQuaCBiL2luY2x1ZGUvYXNtLW02OGsvdmlydGNvbnZlcnQuaAppbmRleCBkZWEzMmZiLi4yMmFiMDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3ZpcnRjb252ZXJ0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay92aXJ0Y29udmVydC5oCkBAIC00MCwxNSArNDAsOSBAQAogCiAvKgogICogSU8gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIDE6MSB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzLAotICogZXhjZXB0IG9uIHRoZSBQQ0kgYnVzIG9mIHRoZSBIYWRlcy4KICAqLwotI2lmZGVmIENPTkZJR19IQURFUwotI2RlZmluZSB2aXJ0X3RvX2J1cyhhKSAodmlydF90b19waHlzKGEpICsgKE1BQ0hfSVNfSEFERVMgPyAweDgwMDAwMDAwIDogMCkpCi0jZGVmaW5lIGJ1c190b192aXJ0KGEpIChwaHlzX3RvX3ZpcnQoKGEpIC0gKE1BQ0hfSVNfSEFERVMgPyAweDgwMDAwMDAwIDogMCkpKQotI2Vsc2UKICNkZWZpbmUgdmlydF90b19idXMgdmlydF90b19waHlzCiAjZGVmaW5lIGJ1c190b192aXJ0IHBoeXNfdG9fdmlydAotI2VuZGlmCiAKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGFnZV8zMi5oIGIvaW5jbHVkZS9hc20teDg2L3BhZ2VfMzIuaAppbmRleCBlOGQ4MGQxLi5iZGY1ZGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGFnZV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wYWdlXzMyLmgKQEAgLTM5LDcgKzM5LDYgQEAKIHR5cGVkZWYgdTY0CXB1ZHZhbF90OwogdHlwZWRlZiB1NjQJcGdkdmFsX3Q7CiB0eXBlZGVmIHU2NAlwZ3Byb3R2YWxfdDsKLXR5cGVkZWYgdTY0CXBoeXNfYWRkcl90OwogCiB0eXBlZGVmIHVuaW9uIHsKIAlzdHJ1Y3QgewpAQCAtNjAsNyArNTksNiBAQAogdHlwZWRlZiB1bnNpZ25lZCBsb25nCXB1ZHZhbF90OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nCXBnZHZhbF90OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nCXBncHJvdHZhbF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nCXBoeXNfYWRkcl90OwogCiB0eXBlZGVmIHVuaW9uIHsKIAlwdGV2YWxfdCBwdGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGFnZV82NC5oIGIvaW5jbHVkZS9hc20teDg2L3BhZ2VfNjQuaAppbmRleCA1ZTY0YWNmLi40OTM4MGI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGFnZV82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wYWdlXzY0LmgKQEAgLTc5LDcgKzc5LDYgQEAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZwlwdWR2YWxfdDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZwlwZ2R2YWxfdDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZwlwZ3Byb3R2YWxfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlwaHlzX2FkZHJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYveGVuL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni94ZW4vcGFnZS5oCmluZGV4IGM1MDE4NWQuLmQ1ZWFkYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni94ZW4vcGFnZS5oCkBAIC03NiwxMyArNzYsMTMgQEAKIHN0YXRpYyBpbmxpbmUgeG1hZGRyX3QgcGh5c190b19tYWNoaW5lKHhwYWRkcl90IHBoeXMpCiB7CiAJdW5zaWduZWQgb2Zmc2V0ID0gcGh5cy5wYWRkciAmIH5QQUdFX01BU0s7Ci0JcmV0dXJuIFhNQUREUihQRk5fUEhZUygodTY0KXBmbl90b19tZm4oUEZOX0RPV04ocGh5cy5wYWRkcikpKSB8IG9mZnNldCk7CisJcmV0dXJuIFhNQUREUihQRk5fUEhZUyhwZm5fdG9fbWZuKFBGTl9ET1dOKHBoeXMucGFkZHIpKSkgfCBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIHhwYWRkcl90IG1hY2hpbmVfdG9fcGh5cyh4bWFkZHJfdCBtYWNoaW5lKQogewogCXVuc2lnbmVkIG9mZnNldCA9IG1hY2hpbmUubWFkZHIgJiB+UEFHRV9NQVNLOwotCXJldHVybiBYUEFERFIoUEZOX1BIWVMoKHU2NCltZm5fdG9fcGZuKFBGTl9ET1dOKG1hY2hpbmUubWFkZHIpKSkgfCBvZmZzZXQpOworCXJldHVybiBYUEFERFIoUEZOX1BIWVMobWZuX3RvX3BmbihQRk5fRE9XTihtYWNoaW5lLm1hZGRyKSkpIHwgb2Zmc2V0KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29uc29sZV9zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvY29uc29sZV9zdHJ1Y3QuaAppbmRleCBiMDNmODBhLi5kNzFmN2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGVfc3RydWN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25zb2xlX3N0cnVjdC5oCkBAIC01Myw3ICs1Myw2IEBACiAJdW5zaWduZWQgc2hvcnQJdmNfaGlfZm9udF9tYXNrOwkvKiBbI10gQXR0cmlidXRlIHNldCBmb3IgdXBwZXIgMjU2IGNoYXJzIG9mIGZvbnQgb3IgMCBpZiBub3Qgc3VwcG9ydGVkICovCiAJc3RydWN0IGNvbnNvbGVfZm9udCB2Y19mb250OwkJLyogQ3VycmVudCBWQyBmb250IHNldCAqLwogCXVuc2lnbmVkIHNob3J0CXZjX3ZpZGVvX2VyYXNlX2NoYXI7CS8qIEJhY2tncm91bmQgZXJhc2UgY2hhcmFjdGVyICovCi0JdW5zaWduZWQgc2hvcnQJdmNfc2NybF9lcmFzZV9jaGFyOwkvKiBFcmFzZSBjaGFyYWN0ZXIgZm9yIHNjcm9sbCAqLwogCS8qIFZUIHRlcm1pbmFsIGRhdGEgKi8KIAl1bnNpZ25lZCBpbnQJdmNfc3RhdGU7CQkvKiBFc2NhcGUgc2VxdWVuY2UgcGFyc2VyIHN0YXRlICovCiAJdW5zaWduZWQgaW50CXZjX25wYXIsdmNfcGFyW05QQVJdOwkvKiBQYXJhbWV0ZXJzIG9mIGN1cnJlbnQgZXNjYXBlIHNlcXVlbmNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggNDRlM2NiMi4uYTZhNjI1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtOTQ3LDYgKzk0NywxNCBAQAogCWludCAoKmZsX2NoYW5nZSkoc3RydWN0IGZpbGVfbG9jayAqKiwgaW50KTsKIH07CiAKK3N0cnVjdCBsb2NrX21hbmFnZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3ZvaWQgbG9ja3Nfc3RhcnRfZ3JhY2Uoc3RydWN0IGxvY2tfbWFuYWdlciAqKTsKK3ZvaWQgbG9ja3NfZW5kX2dyYWNlKHN0cnVjdCBsb2NrX21hbmFnZXIgKik7CitpbnQgbG9ja3NfaW5fZ3JhY2Uodm9pZCk7CisKIC8qIHRoYXQgd2lsbCBkaWUgLSB3ZSBuZWVkIGl0IGZvciBuZnNfbG9ja19pbmZvICovCiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzX2kuaD4KIApAQCAtOTg4LDYgKzk5NiwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KIAorZXh0ZXJuIHZvaWQgc2VuZF9zaWdpbyhzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd24sIGludCBmZCwgaW50IGJhbmQpOworCisvKiBmcy9zeW5jLmMgKi8KK2V4dGVybiBpbnQgZG9fc3luY19tYXBwaW5nX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3Qgb2Zmc2V0LAorCQkJbG9mZl90IGVuZGJ5dGUsIHVuc2lnbmVkIGludCBmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfRklMRV9MT0NLSU5HCiBleHRlcm4gaW50IGZjbnRsX2dldGxrKHN0cnVjdCBmaWxlICosIHN0cnVjdCBmbG9jayBfX3VzZXIgKik7CiBleHRlcm4gaW50IGZjbnRsX3NldGxrKHVuc2lnbmVkIGludCwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAogCQkJc3RydWN0IGZsb2NrIF9fdXNlciAqKTsKQEAgLTk5OCwxNCArMTAxMyw5IEBACiAJCQlzdHJ1Y3QgZmxvY2s2NCBfX3VzZXIgKik7CiAjZW5kaWYKIAotZXh0ZXJuIHZvaWQgc2VuZF9zaWdpbyhzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd24sIGludCBmZCwgaW50IGJhbmQpOwogZXh0ZXJuIGludCBmY250bF9zZXRsZWFzZSh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGZjbnRsX2dldGxlYXNlKHN0cnVjdCBmaWxlICpmaWxwKTsKIAotLyogZnMvc3luYy5jICovCi1leHRlcm4gaW50IGRvX3N5bmNfbWFwcGluZ19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IG9mZnNldCwKLQkJCWxvZmZfdCBlbmRieXRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotCiAvKiBmcy9sb2Nrcy5jICovCiBleHRlcm4gdm9pZCBsb2Nrc19pbml0X2xvY2soc3RydWN0IGZpbGVfbG9jayAqKTsKIGV4dGVybiB2b2lkIGxvY2tzX2NvcHlfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CkBAIC0xMDI4LDYgKzEwMzgsMzcgQEAKIGV4dGVybiBpbnQgbG9ja19tYXlfcmVhZChzdHJ1Y3QgaW5vZGUgKiwgbG9mZl90IHN0YXJ0LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiBpbnQgbG9ja19tYXlfd3JpdGUoc3RydWN0IGlub2RlICosIGxvZmZfdCBzdGFydCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zOworI2Vsc2UgLyogIUNPTkZJR19GSUxFX0xPQ0tJTkcgKi8KKyNkZWZpbmUgZmNudGxfZ2V0bGsoYSwgYikgKHsgLUVJTlZBTDsgfSkKKyNkZWZpbmUgZmNudGxfc2V0bGsoYSwgYiwgYywgZCkgKHsgLUVBQ0NFUzsgfSkKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisjZGVmaW5lIGZjbnRsX2dldGxrNjQoYSwgYikgKHsgLUVJTlZBTDsgfSkKKyNkZWZpbmUgZmNudGxfc2V0bGs2NChhLCBiLCBjLCBkKSAoeyAtRUFDQ0VTOyB9KQorI2VuZGlmCisjZGVmaW5lIGZjbnRsX3NldGxlYXNlKGEsIGIsIGMpICh7IDA7IH0pCisjZGVmaW5lIGZjbnRsX2dldGxlYXNlKGEpICh7IDA7IH0pCisjZGVmaW5lIGxvY2tzX2luaXRfbG9jayhhKSAoeyB9KQorI2RlZmluZSBfX2xvY2tzX2NvcHlfbG9jayhhLCBiKSAoeyB9KQorI2RlZmluZSBsb2Nrc19jb3B5X2xvY2soYSwgYikgKHsgfSkKKyNkZWZpbmUgbG9ja3NfcmVtb3ZlX3Bvc2l4KGEsIGIpICh7IH0pCisjZGVmaW5lIGxvY2tzX3JlbW92ZV9mbG9jayhhKSAoeyB9KQorI2RlZmluZSBwb3NpeF90ZXN0X2xvY2soYSwgYikgKHsgMDsgfSkKKyNkZWZpbmUgcG9zaXhfbG9ja19maWxlKGEsIGIsIGMpICh7IC1FTk9MQ0s7IH0pCisjZGVmaW5lIHBvc2l4X2xvY2tfZmlsZV93YWl0KGEsIGIpICh7IC1FTk9MQ0s7IH0pCisjZGVmaW5lIHBvc2l4X3VuYmxvY2tfbG9jayhhLCBiKSAoLUVOT0VOVCkKKyNkZWZpbmUgdmZzX3Rlc3RfbG9jayhhLCBiKSAoeyAwOyB9KQorI2RlZmluZSB2ZnNfbG9ja19maWxlKGEsIGIsIGMsIGQpICgtRU5PTENLKQorI2RlZmluZSB2ZnNfY2FuY2VsX2xvY2soYSwgYikgKHsgMDsgfSkKKyNkZWZpbmUgZmxvY2tfbG9ja19maWxlX3dhaXQoYSwgYikgKHsgLUVOT0xDSzsgfSkKKyNkZWZpbmUgX19icmVha19sZWFzZShhLCBiKSAoeyAwOyB9KQorI2RlZmluZSBsZWFzZV9nZXRfbXRpbWUoYSwgYikgKHsgfSkKKyNkZWZpbmUgZ2VuZXJpY19zZXRsZWFzZShhLCBiLCBjKSAoeyAtRUlOVkFMOyB9KQorI2RlZmluZSB2ZnNfc2V0bGVhc2UoYSwgYiwgYykgKHsgLUVJTlZBTDsgfSkKKyNkZWZpbmUgbGVhc2VfbW9kaWZ5KGEsIGIpICh7IC1FSU5WQUw7IH0pCisjZGVmaW5lIGxvY2tfbWF5X3JlYWQoYSwgYiwgYykgKHsgMTsgfSkKKyNkZWZpbmUgbG9ja19tYXlfd3JpdGUoYSwgYiwgYykgKHsgMTsgfSkKKyNlbmRpZiAvKiAhQ09ORklHX0ZJTEVfTE9DS0lORyAqLworCiAKIHN0cnVjdCBmYXN5bmNfc3RydWN0IHsKIAlpbnQJbWFnaWM7CkBAIC0xNTc1LDkgKzE2MTYsMTIgQEAKIC8qIC9zeXMvZnMgKi8KIGV4dGVybiBzdHJ1Y3Qga29iamVjdCAqZnNfa29iajsKIAorZXh0ZXJuIGludCByd192ZXJpZnlfYXJlYShpbnQsIHN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzaXplX3QpOworCiAjZGVmaW5lIEZMT0NLX1ZFUklGWV9SRUFEICAxCiAjZGVmaW5lIEZMT0NLX1ZFUklGWV9XUklURSAyCiAKKyNpZmRlZiBDT05GSUdfRklMRV9MT0NLSU5HCiBleHRlcm4gaW50IGxvY2tzX21hbmRhdG9yeV9sb2NrZWQoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBsb2Nrc19tYW5kYXRvcnlfYXJlYShpbnQsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIHNpemVfdCk7CiAKQEAgLTE2MDgsOCArMTY1Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiBpbnQgcndfdmVyaWZ5X2FyZWEoaW50LCBzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90KTsKLQogc3RhdGljIGlubGluZSBpbnQgbG9ja3NfdmVyaWZ5X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSAgICBsb2ZmX3Qgc2l6ZSkKQEAgLTE2MzAsNiArMTY3MiwxNSBAQAogCQlyZXR1cm4gX19icmVha19sZWFzZShpbm9kZSwgbW9kZSk7CiAJcmV0dXJuIDA7CiB9CisjZWxzZSAvKiAhQ09ORklHX0ZJTEVfTE9DS0lORyAqLworI2RlZmluZSBsb2Nrc19tYW5kYXRvcnlfbG9ja2VkKGEpICh7IDA7IH0pCisjZGVmaW5lIGxvY2tzX21hbmRhdG9yeV9hcmVhKGEsIGIsIGMsIGQsIGUpICh7IDA7IH0pCisjZGVmaW5lIF9fbWFuZGF0b3J5X2xvY2soYSkgKHsgMDsgfSkKKyNkZWZpbmUgbWFuZGF0b3J5X2xvY2soYSkgKHsgMDsgfSkKKyNkZWZpbmUgbG9ja3NfdmVyaWZ5X2xvY2tlZChhKSAoeyAwOyB9KQorI2RlZmluZSBsb2Nrc192ZXJpZnlfdHJ1bmNhdGUoYSwgYiwgYykgKHsgMDsgfSkKKyNkZWZpbmUgYnJlYWtfbGVhc2UoYSwgYikgKHsgMDsgfSkKKyNlbmRpZiAvKiBDT05GSUdfRklMRV9MT0NLSU5HICovCiAKIC8qIGZzL29wZW4uYyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hpZC5oIGIvaW5jbHVkZS9saW51eC9oaWQuaAppbmRleCBhYzRlNjc4Li5mMTNiY2EyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaGlkLmgKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+IC8qIGhpZF9kZXZpY2VfaWQgKi8KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0yNDYsNiArMjQ3LDE5IEBACiAjZGVmaW5lIEhJRF9GRUFUVVJFX1JFUE9SVAkyCiAKIC8qCisgKiBISUQgY29ubmVjdCByZXF1ZXN0cworICovCisKKyNkZWZpbmUgSElEX0NPTk5FQ1RfSElESU5QVVQJCTB4MDEKKyNkZWZpbmUgSElEX0NPTk5FQ1RfSElESU5QVVRfRk9SQ0UJMHgwMgorI2RlZmluZSBISURfQ09OTkVDVF9ISURSQVcJCTB4MDQKKyNkZWZpbmUgSElEX0NPTk5FQ1RfSElEREVWCQkweDA4CisjZGVmaW5lIEhJRF9DT05ORUNUX0hJRERFVl9GT1JDRQkweDEwCisjZGVmaW5lIEhJRF9DT05ORUNUX0ZGCQkJMHgyMAorI2RlZmluZSBISURfQ09OTkVDVF9ERUZBVUxUCShISURfQ09OTkVDVF9ISURJTlBVVHxISURfQ09OTkVDVF9ISURSQVd8IFwKKwkJSElEX0NPTk5FQ1RfSElEREVWfEhJRF9DT05ORUNUX0ZGKQorCisvKgogICogSElEIGRldmljZSBxdWlya3MuCiAgKi8KIApAQCAtMjU2LDQ4ICsyNzAsMTEgQEAKIAogI2RlZmluZSBISURfUVVJUktfSU5WRVJUCQkJMHgwMDAwMDAwMQogI2RlZmluZSBISURfUVVJUktfTk9UT1VDSAkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRQkJCTB4MDAwMDAwMDQKICNkZWZpbmUgSElEX1FVSVJLX05PR0VUCQkJCTB4MDAwMDAwMDgKLSNkZWZpbmUgSElEX1FVSVJLX0hJRERFVgkJCTB4MDAwMDAwMTAKICNkZWZpbmUgSElEX1FVSVJLX0JBRFBBRAkJCTB4MDAwMDAwMjAKICNkZWZpbmUgSElEX1FVSVJLX01VTFRJX0lOUFVUCQkJMHgwMDAwMDA0MAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNwkJMHgwMDAwMDA4MAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNQkJMHgwMDAwMDEwMAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT04JCTB4MDAwMDAyMDAKLSNkZWZpbmUgSElEX1FVSVJLX01JR0hUWU1PVVNFCQkJMHgwMDAwMDQwMAotI2RlZmluZSBISURfUVVJUktfQVBQTEVfSEFTX0ZOCQkJMHgwMDAwMDgwMAotI2RlZmluZSBISURfUVVJUktfQVBQTEVfRk5fT04JCQkweDAwMDAxMDAwCi0jZGVmaW5lIEhJRF9RVUlSS19JTlZFUlRfSFdIRUVMCQkJMHgwMDAwMjAwMAotI2RlZmluZSBISURfUVVJUktfQVBQTEVfSVNPX0tFWUJPQVJECQkweDAwMDA0MDAwCi0jZGVmaW5lIEhJRF9RVUlSS19CQURfUkVMQVRJVkVfS0VZUwkJMHgwMDAwODAwMAogI2RlZmluZSBISURfUVVJUktfU0tJUF9PVVRQVVRfUkVQT1JUUwkJMHgwMDAxMDAwMAotI2RlZmluZSBISURfUVVJUktfSUdOT1JFX01PVVNFCQkJMHgwMDAyMDAwMAotI2RlZmluZSBISURfUVVJUktfU09OWV9QUzNfQ09OVFJPTExFUgkJMHgwMDA0MDAwMAotI2RlZmluZSBISURfUVVJUktfRFVQTElDQVRFX1VTQUdFUwkJMHgwMDA4MDAwMAotI2RlZmluZSBISURfUVVJUktfUkVTRVRfTEVEUwkJCTB4MDAxMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0hJRElOUFVUCQkJMHgwMDIwMDAwMAotI2RlZmluZSBISURfUVVJUktfTE9HSVRFQ0hfSUdOT1JFX0RPVUJMRURfV0hFRUwJMHgwMDQwMDAwMAotI2RlZmluZSBISURfUVVJUktfTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQCTB4MDA4MDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRV9ISURJTlBVVAkJMHgwMTAwMDAwMAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfQjgJCTB4MDIwMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0hXSEVFTF9XSEVFTF9JTlZFUlQJCTB4MDQwMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX01JQ1JPU09GVF9LRVlTCQkweDA4MDAwMDAwCiAjZGVmaW5lIEhJRF9RVUlSS19GVUxMU1BFRURfSU5URVJWQUwJCTB4MTAwMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OCTB4MjAwMDAwMDAKLQotLyoKLSAqIFNlcGFyYXRlIHF1aXJrcyBmb3IgcnVudGltZSByZXBvcnQgZGVzY3JpcHRvciBmaXh1cAotICovCi0KLSNkZWZpbmUgSElEX1FVSVJLX1JERVNDX0NZTU9USU9OCQkweDAwMDAwMDAxCi0jZGVmaW5lIEhJRF9RVUlSS19SREVTQ19MT0dJVEVDSAkJMHgwMDAwMDAwMgotI2RlZmluZSBISURfUVVJUktfUkRFU0NfU1dBUFBFRF9NSU5fTUFYCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEhJRF9RVUlSS19SREVTQ19QRVRBTFlOWAkJMHgwMDAwMDAwOAotI2RlZmluZSBISURfUVVJUktfUkRFU0NfTUFDQk9PS19KSVMJCTB4MDAwMDAwMTAKLSNkZWZpbmUgSElEX1FVSVJLX1JERVNDX0JVVFRPTl9DT05TVU1FUgkJMHgwMDAwMDAyMAotI2RlZmluZSBISURfUVVJUktfUkRFU0NfU0FNU1VOR19SRU1PVEUJCTB4MDAwMDAwNDAKLSNkZWZpbmUgSElEX1FVSVJLX1JERVNDX01JQ1JPU09GVF9SRUNWXzEwMjgJMHgwMDAwMDA4MAotI2RlZmluZSBISURfUVVJUktfUkRFU0NfU1VOUExVU19XREVTS1RPUAkweDAwMDAwMTAwCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgb2YgdGhlIHBhcnNlci4gVGhpcyBpbmZvcm1hdGlvbiBpcwpAQCAtNDExLDEyICszODgsMjEgQEAKIHN0cnVjdCBoaWRfY29udHJvbF9maWZvIHsKIAl1bnNpZ25lZCBjaGFyIGRpcjsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCWNoYXIgKnJhd19yZXBvcnQ7Cit9OworCitzdHJ1Y3QgaGlkX291dHB1dF9maWZvIHsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCWNoYXIgKnJhd19yZXBvcnQ7CiB9OwogCiAjZGVmaW5lIEhJRF9DTEFJTUVEX0lOUFVUCTEKICNkZWZpbmUgSElEX0NMQUlNRURfSElEREVWCTIKICNkZWZpbmUgSElEX0NMQUlNRURfSElEUkFXCTQKIAorI2RlZmluZSBISURfU1RBVF9BRERFRAkJMQorI2RlZmluZSBISURfU1RBVF9QQVJTRUQJCTIKKwogI2RlZmluZSBISURfQ1RSTF9SVU5OSU5HCTEKICNkZWZpbmUgSElEX09VVF9SVU5OSU5HCQkyCiAjZGVmaW5lIEhJRF9JTl9SVU5OSU5HCQkzCkBAIC00MzEsMjIgKzQxNywyOCBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogfTsKIAorc3RydWN0IGhpZF9kcml2ZXI7CitzdHJ1Y3QgaGlkX2xsX2RyaXZlcjsKKwogc3RydWN0IGhpZF9kZXZpY2UgewkJCQkJCQkvKiBkZXZpY2UgcmVwb3J0IGRlc2NyaXB0b3IgKi8KLQkgX191OCAqcmRlc2M7CisJX191OCAqcmRlc2M7CiAJdW5zaWduZWQgcnNpemU7CiAJc3RydWN0IGhpZF9jb2xsZWN0aW9uICpjb2xsZWN0aW9uOwkJCQkvKiBMaXN0IG9mIEhJRCBjb2xsZWN0aW9ucyAqLwogCXVuc2lnbmVkIGNvbGxlY3Rpb25fc2l6ZTsJCQkJCS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgaGlkX2NvbGxlY3Rpb25zICovCiAJdW5zaWduZWQgbWF4Y29sbGVjdGlvbjsJCQkJCQkvKiBOdW1iZXIgb2YgcGFyc2VkIGNvbGxlY3Rpb25zICovCiAJdW5zaWduZWQgbWF4YXBwbGljYXRpb247CQkJCQkvKiBOdW1iZXIgb2YgYXBwbGljYXRpb25zICovCi0JdW5zaWduZWQgc2hvcnQgYnVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJVUyBJRCAqLwotCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgSUQgKi8KLQl1bnNpZ25lZCBzaG9ydCBwcm9kdWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZHVjdCBJRCAqLwotCXVuc2lnbmVkIHZlcnNpb247CQkJCQkJLyogSElEIHZlcnNpb24gKi8KKwlfX3UxNiBidXM7CQkJCQkJCS8qIEJVUyBJRCAqLworCV9fdTMyIHZlbmRvcjsJCQkJCQkJLyogVmVuZG9yIElEICovCisJX191MzIgcHJvZHVjdDsJCQkJCQkJLyogUHJvZHVjdCBJRCAqLworCV9fdTMyIHZlcnNpb247CQkJCQkJCS8qIEhJRCB2ZXJzaW9uICovCiAJdW5zaWduZWQgY291bnRyeTsJCQkJCQkvKiBISUQgY291bnRyeSAqLwogCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gcmVwb3J0X2VudW1bSElEX1JFUE9SVF9UWVBFU107CiAKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkJCQkJLyogZGV2aWNlICovCisJc3RydWN0IGRldmljZSBkZXY7CQkJCQkJLyogZGV2aWNlICovCisJc3RydWN0IGhpZF9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3QgaGlkX2xsX2RyaXZlciAqbGxfZHJpdmVyOwogCisJdW5zaWduZWQgaW50IHN0YXR1czsJCQkJCQkvKiBzZWUgU1RBVCBmbGFncyBhYm92ZSAqLwogCXVuc2lnbmVkIGNsYWltZWQ7CQkJCQkJLyogQ2xhaW1lZCBieSBoaWRpbnB1dCwgaGlkZGV2PyAqLwogCXVuc2lnbmVkIHF1aXJrczsJCQkJCQkvKiBWYXJpb3VzIHF1aXJrcyB0aGUgZGV2aWNlIGNhbiBwdWxsIG9uIHVzICovCiAKQEAgLTQ2MiwyNiArNDU0LDI5IEBACiAKIAl2b2lkICpkcml2ZXJfZGF0YTsKIAotCV9fczMyIGRlbGF5ZWRfdmFsdWU7CQkJCQkJLyogRm9yIEE0IFRlY2ggbWljZSBod2hlZWwgcXVpcmsgKi8KLQotCS8qIGRldmljZS1zcGVjaWZpYyBmdW5jdGlvbiBwb2ludGVycyAqLwotCWludCAoKmhpZGlucHV0X2lucHV0X2V2ZW50KSAoc3RydWN0IGlucHV0X2RldiAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KTsKLQlpbnQgKCpoaWRfb3BlbikgKHN0cnVjdCBoaWRfZGV2aWNlICopOwotCXZvaWQgKCpoaWRfY2xvc2UpIChzdHJ1Y3QgaGlkX2RldmljZSAqKTsKKwkvKiB0ZW1wb3JhcnkgaGlkX2ZmIGhhbmRsaW5nICh1bnRpbCBtb3ZlZCB0byB0aGUgZHJpdmVycykgKi8KKwlpbnQgKCpmZl9pbml0KShzdHJ1Y3QgaGlkX2RldmljZSAqKTsKIAogCS8qIGhpZGRldiBldmVudCBoYW5kbGVyICovCisJaW50ICgqaGlkZGV2X2Nvbm5lY3QpKHN0cnVjdCBoaWRfZGV2aWNlICosIHVuc2lnbmVkIGludCk7CiAJdm9pZCAoKmhpZGRldl9oaWRfZXZlbnQpIChzdHJ1Y3QgaGlkX2RldmljZSAqLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKIAkJCQkgIHN0cnVjdCBoaWRfdXNhZ2UgKiwgX19zMzIpOwogCXZvaWQgKCpoaWRkZXZfcmVwb3J0X2V2ZW50KSAoc3RydWN0IGhpZF9kZXZpY2UgKiwgc3RydWN0IGhpZF9yZXBvcnQgKik7CiAKIAkvKiBoYW5kbGVyIGZvciByYXcgb3V0cHV0IGRhdGEsIHVzZWQgYnkgaGlkcmF3ICovCiAJaW50ICgqaGlkX291dHB1dF9yYXdfcmVwb3J0KSAoc3RydWN0IGhpZF9kZXZpY2UgKiwgX191OCAqLCBzaXplX3QpOwotI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCi0JdW5zaWduZWQgbG9uZyBhcHBsZV9wcmVzc2VkX2ZuW0JJVFNfVE9fTE9OR1MoS0VZX0NOVCldOwotCXVuc2lnbmVkIGxvbmcgcGJfcHJlc3NlZF9udW1sb2NrW0JJVFNfVE9fTE9OR1MoS0VZX0NOVCldOwotI2VuZGlmCiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgKmhpZF9nZXRfZHJ2ZGF0YShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZoZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkX3NldF9kcnZkYXRhKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCB2b2lkICpkYXRhKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmaGRldi0+ZGV2LCBkYXRhKTsKK30KKwogI2RlZmluZSBISURfR0xPQkFMX1NUQUNLX1NJWkUgNAogI2RlZmluZSBISURfQ09MTEVDVElPTl9TVEFDS19TSVpFIDQKIApAQCAtNTEwLDYgKzUwNSwxMDcgQEAKIAlzdHJ1Y3QgaGlkX2NsYXNzX2Rlc2NyaXB0b3IgZGVzY1sxXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisjZGVmaW5lIEhJRF9ERVZJQ0UoYiwgdmVuLCBwcm9kKSBcCisJLmJ1cyA9IChiKSwgXAorCS52ZW5kb3IgPSAodmVuKSwgLnByb2R1Y3QgPSAocHJvZCkKKworI2RlZmluZSBISURfVVNCX0RFVklDRSh2ZW4sIHByb2QpCUhJRF9ERVZJQ0UoQlVTX1VTQiwgdmVuLCBwcm9kKQorI2RlZmluZSBISURfQkxVRVRPT1RIX0RFVklDRSh2ZW4sIHByb2QpCUhJRF9ERVZJQ0UoQlVTX0JMVUVUT09USCwgdmVuLCBwcm9kKQorCisjZGVmaW5lIEhJRF9SRVBPUlRfSUQocmVwKSBcCisJLnJlcG9ydF90eXBlID0gKHJlcCkKKyNkZWZpbmUgSElEX1VTQUdFX0lEKHVoaWQsIHV0eXBlLCB1Y29kZSkgXAorCS51c2FnZV9oaWQgPSAodWhpZCksIC51c2FnZV90eXBlID0gKHV0eXBlKSwgLnVzYWdlX2NvZGUgPSAodWNvZGUpCisvKiB3ZSBkb24ndCB3YW50IHRvIGNhdGNoIHR5cGVzIGFuZCBjb2RlcyBlcXVhbCB0byAwICovCisjZGVmaW5lIEhJRF9URVJNSU5BVE9SCQkoSElEX0FOWV9JRCAtIDEpCisKK3N0cnVjdCBoaWRfcmVwb3J0X2lkIHsKKwlfX3UzMiByZXBvcnRfdHlwZTsKK307CitzdHJ1Y3QgaGlkX3VzYWdlX2lkIHsKKwlfX3UzMiB1c2FnZV9oaWQ7CisJX191MzIgdXNhZ2VfdHlwZTsKKwlfX3UzMiB1c2FnZV9jb2RlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaGlkX2RyaXZlcgorICogQG5hbWU6IGRyaXZlciBuYW1lIChlLmcuICJGb290ZWNoX2Jhci13aGVlbCIpCisgKiBAaWRfdGFibGU6IHdoaWNoIGRldmljZXMgaXMgdGhpcyBkcml2ZXIgZm9yIChtdXN0IGJlIG5vbi1OVUxMIGZvciBwcm9iZQorICogCSAgICAgIHRvIGJlIGNhbGxlZCkKKyAqIEBwcm9iZTogbmV3IGRldmljZSBpbnNlcnRlZAorICogQHJlbW92ZTogZGV2aWNlIHJlbW92ZWQgKE5VTEwgaWYgbm90IGEgaG90LXBsdWcgY2FwYWJsZSBkcml2ZXIpCisgKiBAcmVwb3J0X3RhYmxlOiBvbiB3aGljaCByZXBvcnRzIHRvIGNhbGwgcmF3X2V2ZW50IChOVUxMIG1lYW5zIGFsbCkKKyAqIEByYXdfZXZlbnQ6IGlmIHJlcG9ydCBpbiByZXBvcnRfdGFibGUsIHRoaXMgaG9vayBpcyBjYWxsZWQgKE5VTEwgbWVhbnMgbm9wKQorICogQHVzYWdlX3RhYmxlOiBvbiB3aGljaCBldmVudHMgdG8gY2FsbCBldmVudCAoTlVMTCBtZWFucyBhbGwpCisgKiBAZXZlbnQ6IGlmIHVzYWdlIGluIHVzYWdlX3RhYmxlLCB0aGlzIGhvb2sgaXMgY2FsbGVkIChOVUxMIG1lYW5zIG5vcCkKKyAqIEByZXBvcnRfZml4dXA6IGNhbGxlZCBiZWZvcmUgcmVwb3J0IGRlc2NyaXB0b3IgcGFyc2luZyAoTlVMTCBtZWFucyBub3ApCisgKiBAaW5wdXRfbWFwcGluZzogaW52b2tlZCBvbiBpbnB1dCByZWdpc3RlcmluZyBiZWZvcmUgbWFwcGluZyBhbiB1c2FnZQorICogQGlucHV0X21hcHBlZDogaW52b2tlZCBvbiBpbnB1dCByZWdpc3RlcmluZyBhZnRlciBtYXBwaW5nIGFuIHVzYWdlCisgKgorICogcmF3X2V2ZW50IGFuZCBldmVudCBzaG91bGQgcmV0dXJuIDAgb24gbm8gYWN0aW9uIHBlcmZvcm1lZCwgMSB3aGVuIG5vCisgKiBmdXJ0aGVyIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgYW5kIG5lZ2F0aXZlIG9uIGVycm9yCisgKgorICogaW5wdXRfbWFwcGluZyBzaGFsbCByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSB0byBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIHVzYWdlCisgKiAoZS5nLiBkb3VibGVkIG9yIGludmFsaWQgdXNhZ2UpLCB6ZXJvIHRvIGNvbnRpbnVlIHdpdGggcGFyc2luZyBvZiB0aGlzCisgKiB1c2FnZSBieSBnZW5lcmljIGNvZGUgKG5vIHNwZWNpYWwgaGFuZGxpbmcgbmVlZGVkKSBvciBwb3NpdGl2ZSB0byBza2lwCisgKiBnZW5lcmljIHBhcnNpbmcgKG5lZWRlZCBzcGVjaWFsIGhhbmRsaW5nIHdoaWNoIHdhcyBkb25lIGluIHRoZSBob29rIGFscmVhZHkpCisgKiBpbnB1dF9tYXBwZWQgc2hhbGwgcmV0dXJuIG5lZ2F0aXZlIHRvIGluZm9ybSB0aGUgbGF5ZXIgdGhhdCB0aGlzIHVzYWdlCisgKiBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBvciB6ZXJvIHRvIG5vdGlmeSB0aGF0CisgKiBubyBwcm9jZXNzaW5nIHdhcyBwZXJmb3JtZWQgYW5kIHNob3VsZCBiZSBkb25lIGluIGEgZ2VuZXJpYyBtYW5uZXIKKyAqIEJvdGggdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBOVUxMIHdoaWNoIG1lYW5zIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHJldHVybmluZworICogemVybyBmcm9tIHRoZW0uCisgKi8KK3N0cnVjdCBoaWRfZHJpdmVyIHsKKwljaGFyICpuYW1lOworCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZF90YWJsZTsKKworCWludCAoKnByb2JlKShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpOworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBoaWRfZGV2aWNlICpkZXYpOworCisJY29uc3Qgc3RydWN0IGhpZF9yZXBvcnRfaWQgKnJlcG9ydF90YWJsZTsKKwlpbnQgKCpyYXdfZXZlbnQpKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LAorCQkJdTggKmRhdGEsIGludCBzaXplKTsKKwljb25zdCBzdHJ1Y3QgaGlkX3VzYWdlX2lkICp1c2FnZV90YWJsZTsKKwlpbnQgKCpldmVudCkoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKTsKKworCXZvaWQgKCpyZXBvcnRfZml4dXApKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpidWYsCisJCQl1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKwlpbnQgKCppbnB1dF9tYXBwaW5nKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCk7CisJaW50ICgqaW5wdXRfbWFwcGVkKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCk7CisvKiBwcml2YXRlOiAqLworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKK307CisKKy8qKgorICogaGlkX2xsX2RyaXZlciAtIGxvdyBsZXZlbCBkcml2ZXIgY2FsbGJhY2tzCisgKiBAc3RhcnQ6IGNhbGxlZCBvbiBwcm9iZSB0byBzdGFydCB0aGUgZGV2aWNlCisgKiBAc3RvcDogY2FsbGVkIG9uIHJlbW92ZQorICogQG9wZW46IGNhbGxlZCBieSBpbnB1dCBsYXllciBvbiBvcGVuCisgKiBAY2xvc2U6IGNhbGxlZCBieSBpbnB1dCBsYXllciBvbiBjbG9zZQorICogQGhpZGlucHV0X2lucHV0X2V2ZW50OiBldmVudCBpbnB1dCBldmVudCAoZS5nLiBmZiBvciBsZWRzKQorICogQHBhcnNlOiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBvbmNlIHRvIHBhcnNlIHRoZSBkZXZpY2UgZGF0YSwKKyAqCSAgIHNob3VsZG4ndCBhbGxvY2F0ZSBhbnl0aGluZyB0byBub3QgbGVhayBtZW1vcnkKKyAqLworc3RydWN0IGhpZF9sbF9kcml2ZXIgeworCWludCAoKnN0YXJ0KShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldik7CisJdm9pZCAoKnN0b3ApKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKworCWludCAoKm9wZW4pKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKwl2b2lkICgqY2xvc2UpKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKworCWludCAoKmhpZGlucHV0X2lucHV0X2V2ZW50KSAoc3RydWN0IGlucHV0X2RldiAqaWRldiwgdW5zaWduZWQgaW50IHR5cGUsCisJCQl1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKTsKKworCWludCAoKnBhcnNlKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldik7Cit9OworCiAvKiBBcHBsaWNhdGlvbnMgZnJvbSBISUQgVXNhZ2UgVGFibGVzIDQvOC85OSBWZXJzaW9uIDEuMSAqLwogLyogV2UgaWdub3JlIGEgZmV3IGlucHV0IGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3Qgd2lkZWx5IHVzZWQgKi8KICNkZWZpbmUgSVNfSU5QVVRfQVBQTElDQVRJT04oYSkgKCgoYSA+PSAweDAwMDEwMDAwKSAmJiAoYSA8PSAweDAwMDEwMDA4KSkgfHwgKGEgPT0gMHgwMDAxMDA4MCkgfHwgKGEgPT0gMHgwMDBjMDAwMSkgfHwgKGEgPT0gMHgwMDBkMDAwMikpCkBAIC01MjAsNDMgKzYxNiwxNTcgQEAKIGV4dGVybiBpbnQgaGlkX2RlYnVnOwogI2VuZGlmCiAKK2V4dGVybiBpbnQgaGlkX2FkZF9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBoaWRfZGVzdHJveV9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKik7CisKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIF9faGlkX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaGlkX2RyaXZlciAqLAorCQlzdHJ1Y3QgbW9kdWxlICosIGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBoaWRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBoaWRfZHJpdmVyICpkcml2ZXIpCit7CisJcmV0dXJuIF9faGlkX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSk7Cit9CitleHRlcm4gdm9pZCBoaWRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKik7CisKIGV4dGVybiB2b2lkIGhpZGlucHV0X2hpZF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqLCBzdHJ1Y3QgaGlkX2ZpZWxkICosIHN0cnVjdCBoaWRfdXNhZ2UgKiwgX19zMzIpOwogZXh0ZXJuIHZvaWQgaGlkaW5wdXRfcmVwb3J0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpOwotZXh0ZXJuIGludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICopOworZXh0ZXJuIGludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCBmb3JjZSk7CiBleHRlcm4gdm9pZCBoaWRpbnB1dF9kaXNjb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICopOwogCiBpbnQgaGlkX3NldF9maWVsZChzdHJ1Y3QgaGlkX2ZpZWxkICosIHVuc2lnbmVkLCBfX3MzMik7CiBpbnQgaGlkX2lucHV0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqLCBpbnQgdHlwZSwgdTggKiwgaW50LCBpbnQpOwogaW50IGhpZGlucHV0X2ZpbmRfZmllbGQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBzdHJ1Y3QgaGlkX2ZpZWxkICoqZmllbGQpOwotaW50IGhpZGlucHV0X21hcHBpbmdfcXVpcmtzKHN0cnVjdCBoaWRfdXNhZ2UgKiwgc3RydWN0IGlucHV0X2RldiAqLCB1bnNpZ25lZCBsb25nICoqLCBpbnQgKik7Ci1pbnQgaGlkaW5wdXRfZXZlbnRfcXVpcmtzKHN0cnVjdCBoaWRfZGV2aWNlICosIHN0cnVjdCBoaWRfZmllbGQgKiwgc3RydWN0IGhpZF91c2FnZSAqLCBfX3MzMik7Ci1pbnQgaGlkaW5wdXRfYXBwbGVfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKiwgc3RydWN0IGlucHV0X2RldiAqLCBzdHJ1Y3QgaGlkX3VzYWdlICosIF9fczMyKTsKIHZvaWQgaGlkX291dHB1dF9yZXBvcnQoc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgX191OCAqZGF0YSk7Ci12b2lkIGhpZF9mcmVlX2RldmljZShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlKTsKLXN0cnVjdCBoaWRfZGV2aWNlICpoaWRfcGFyc2VfcmVwb3J0KF9fdTggKnN0YXJ0LCB1bnNpZ25lZCBzaXplKTsKK3N0cnVjdCBoaWRfZGV2aWNlICpoaWRfYWxsb2NhdGVfZGV2aWNlKHZvaWQpOworaW50IGhpZF9wYXJzZV9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgX191OCAqc3RhcnQsIHVuc2lnbmVkIHNpemUpOworaW50IGhpZF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCBjb25uZWN0X21hc2spOworCisvKioKKyAqIGhpZF9tYXBfdXNhZ2UgLSBtYXAgdXNhZ2UgaW5wdXQgYml0cworICoKKyAqIEBoaWRpbnB1dDogaGlkaW5wdXQgd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqIEB1c2FnZTogdXNhZ2UgdG8gZmlsbCBpbgorICogQGJpdDogcG9pbnRlciB0byBpbnB1dC0+e31iaXQgKG91dCBwYXJhbWV0ZXIpCisgKiBAbWF4OiBtYXhpbWFsIHZhbGlkIHVzYWdlLT5jb2RlIHRvIGNvbnNpZGVyIGxhdGVyIChvdXQgcGFyYW1ldGVyKQorICogQHR5cGU6IGlucHV0IGV2ZW50IHR5cGUgKEVWX0tFWSwgRVZfUkVMLCAuLi4pCisgKiBAYzogY29kZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGlzIHVzYWdlIGFuZCB0eXBlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRfbWFwX3VzYWdlKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgsCisJCV9fdTggdHlwZSwgX191MTYgYykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGhpZGlucHV0LT5pbnB1dDsKKworCXVzYWdlLT50eXBlID0gdHlwZTsKKwl1c2FnZS0+Y29kZSA9IGM7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVWX0FCUzoKKwkJKmJpdCA9IGlucHV0LT5hYnNiaXQ7CisJCSptYXggPSBBQlNfTUFYOworCQlicmVhazsKKwljYXNlIEVWX1JFTDoKKwkJKmJpdCA9IGlucHV0LT5yZWxiaXQ7CisJCSptYXggPSBSRUxfTUFYOworCQlicmVhazsKKwljYXNlIEVWX0tFWToKKwkJKmJpdCA9IGlucHV0LT5rZXliaXQ7CisJCSptYXggPSBLRVlfTUFYOworCQlicmVhazsKKwljYXNlIEVWX0xFRDoKKwkJKmJpdCA9IGlucHV0LT5sZWRiaXQ7CisJCSptYXggPSBMRURfTUFYOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogaGlkX21hcF91c2FnZV9jbGVhciAtIG1hcCB1c2FnZSBpbnB1dCBiaXRzIGFuZCBjbGVhciB0aGUgaW5wdXQgYml0CisgKgorICogVGhlIHNhbWUgYXMgaGlkX21hcF91c2FnZSwgZXhjZXB0IHRoZSBAYyBiaXQgaXMgYWxzbyBjbGVhcmVkIGluIHN1cHBvcnRlZAorICogYml0cyAoQGJpdCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRfbWFwX3VzYWdlX2NsZWFyKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgsCisJCV9fdTggdHlwZSwgX191MTYgYykKK3sKKwloaWRfbWFwX3VzYWdlKGhpZGlucHV0LCB1c2FnZSwgYml0LCBtYXgsIHR5cGUsIGMpOworCWNsZWFyX2JpdChjLCAqYml0KTsKK30KKworLyoqCisgKiBoaWRfcGFyc2UgLSBwYXJzZSBIVyByZXBvcnRzCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqCisgKiBDYWxsIHRoaXMgZnJvbSBwcm9iZSBhZnRlciB5b3Ugc2V0IHVwIHRoZSBkZXZpY2UgKGlmIG5lZWRlZCkuIFlvdXIKKyAqIHJlcG9ydF9maXh1cCB3aWxsIGJlIGNhbGxlZCAoaWYgbm9uLU5VTEwpIGFmdGVyIHJlYWRpbmcgcmF3IHJlcG9ydCBmcm9tCisgKiBkZXZpY2UgYmVmb3JlIHBhc3NpbmcgaXQgdG8gaGlkIGxheWVyIGZvciByZWFsIHBhcnNpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBoaWRfcGFyc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJaW50IHJldDsKKworCWlmIChoZGV2LT5zdGF0dXMgJiBISURfU1RBVF9QQVJTRUQpCisJCXJldHVybiAwOworCisJcmV0ID0gaGRldi0+bGxfZHJpdmVyLT5wYXJzZShoZGV2KTsKKwlpZiAoIXJldCkKKwkJaGRldi0+c3RhdHVzIHw9IEhJRF9TVEFUX1BBUlNFRDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGlkX2h3X3N0YXJ0IC0gc3RhcnQgdW5kZXJsYXlpbmcgSFcKKyAqCisgKiBAaGRldjogaGlkIGRldmljZQorICogQGNvbm5lY3RfbWFzazogd2hpY2ggb3V0cHV0cyB0byBjb25uZWN0LCBzZWUgSElEX0NPTk5FQ1RfKgorICoKKyAqIENhbGwgdGhpcyBpbiBwcm9iZSBmdW5jdGlvbiAqYWZ0ZXIqIGhpZF9wYXJzZS4gVGhpcyB3aWxsIHNldHVwIEhXIGJ1ZmZlcnMKKyAqIGFuZCBzdGFydCB0aGUgZGV2aWNlIChpZiBub3QgZGVmZmVyZWQgdG8gZGV2aWNlIG9wZW4pLiBoaWRfaHdfc3RvcCBtdXN0IGJlCisgKiBjYWxsZWQgaWYgdGhpcyB3YXMgc3VjY2Vzc2Z1bGwuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBoaWRfaHdfc3RhcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCXVuc2lnbmVkIGludCBjb25uZWN0X21hc2spCit7CisJaW50IHJldCA9IGhkZXYtPmxsX2RyaXZlci0+c3RhcnQoaGRldik7CisJaWYgKHJldCB8fCAhY29ubmVjdF9tYXNrKQorCQlyZXR1cm4gcmV0OworCXJldCA9IGhpZF9jb25uZWN0KGhkZXYsIGNvbm5lY3RfbWFzayk7CisJaWYgKHJldCkKKwkJaGRldi0+bGxfZHJpdmVyLT5zdG9wKGhkZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGlkX2h3X3N0b3AgLSBzdG9wIHVuZGVybGF5aW5nIEhXCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqCisgKiBUaGlzIGlzIHVzdWFsbHkgY2FsbGVkIGZyb20gcmVtb3ZlIGZ1bmN0aW9uIG9yIGZyb20gcHJvYmUgd2hlbiBzb21ldGhpbmcKKyAqIGZhaWxlZCBhbmQgaGlkX2h3X3N0YXJ0IHdhcyBjYWxsZWQgYWxyZWFkeS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhpZF9od19zdG9wKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCWhkZXYtPmxsX2RyaXZlci0+c3RvcChoZGV2KTsKK30KKwordm9pZCBoaWRfcmVwb3J0X3Jhd19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBpbnQgdHlwZSwgdTggKmRhdGEsIGludCBzaXplLAorCQlpbnQgaW50ZXJydXB0KTsKKworZXh0ZXJuIGludCBoaWRfZ2VuZXJpY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaGlkX2dlbmVyaWNfZXhpdCh2b2lkKTsKIAogLyogSElEIHF1aXJrcyBBUEkgKi8KIHUzMiB1c2JoaWRfbG9va3VwX3F1aXJrKGNvbnN0IHUxNiBpZFZlbmRvciwgY29uc3QgdTE2IGlkUHJvZHVjdCk7CiBpbnQgdXNiaGlkX3F1aXJrc19pbml0KGNoYXIgKipxdWlya3NfcGFyYW0pOwogdm9pZCB1c2JoaWRfcXVpcmtzX2V4aXQodm9pZCk7Ci12b2lkIHVzYmhpZF9maXh1cF9yZXBvcnRfZGVzY3JpcHRvcihjb25zdCB1MTYsIGNvbnN0IHUxNiwgY2hhciAqLCB1bnNpZ25lZCwgY2hhciAqKik7Cit2b2lkIHVzYmhpZF9zZXRfbGVkcyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKIAotI2lmZGVmIENPTkZJR19ISURfRkYKLWludCBoaWRfZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKLQotaW50IGhpZF9sZ2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7Ci1pbnQgaGlkX2xnMmZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7Ci1pbnQgaGlkX3BsZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKLWludCBoaWRfdG1mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOwotaW50IGhpZF96cGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CiAjaWZkZWYgQ09ORklHX0hJRF9QSUQKIGludCBoaWRfcGlkZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBoaWRfcGlkZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7IHJldHVybiAtRU5PREVWOyB9Ci0jZW5kaWYKLQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGhpZF9mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgcmV0dXJuIC0xOyB9CisjZGVmaW5lIGhpZF9waWRmZl9pbml0IE5VTEwKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hJRF9ERUJVRwpAQCAtNTcyLDEwICs3ODIsMjMgQEAKIAlyZXR1cm4gMDsKIH0KICNkZWZpbmUgZGJnX2hpZF9saW5lIGRiZ19oaWQKLSNlbmRpZgorI2VuZGlmIC8qIEhJRF9ERUJVRyAqLwogCiAjZGVmaW5lIGVycl9oaWQoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIgLCBcCiAJCV9fRklMRV9fICwgIyMgYXJnKQotI2VuZGlmCisjZW5kaWYgLyogSElEX0ZGICovCisKKyNpZmRlZiBDT05GSUdfSElEX0NPTVBBVAorI2RlZmluZSBISURfQ09NUEFUX0xPQURfRFJJVkVSKG5hbWUpCVwKK3ZvaWQgaGlkX2NvbXBhdF8jI25hbWUodm9pZCkgeyB9CVwKK0VYUE9SVF9TWU1CT0woaGlkX2NvbXBhdF8jI25hbWUpCisjZWxzZQorI2RlZmluZSBISURfQ09NUEFUX0xPQURfRFJJVkVSKG5hbWUpCisjZW5kaWYgLyogSElEX0NPTVBBVCAqLworI2RlZmluZSBISURfQ09NUEFUX0NBTExfRFJJVkVSKG5hbWUpCWRvIHsJXAorCWV4dGVybiB2b2lkIGhpZF9jb21wYXRfIyNuYW1lKHZvaWQpOwlcCisJaGlkX2NvbXBhdF8jI25hbWUoKTsJCQlcCit9IHdoaWxlICgwKQorCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWRkZXYuaCBiL2luY2x1ZGUvbGludXgvaGlkZGV2LmgKaW5kZXggYTQxNmI5MC4uYzc2MGFlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWRkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZGRldi5oCkBAIC0xODIsMjYgKzE4MiwyOCBAQAogLyogVG8gdHJhdmVyc2UgdGhlIGlucHV0IHJlcG9ydCBkZXNjcmlwdG9yIGluZm8gZm9yIGEgSElEIGRldmljZSwgcGVyZm9ybSB0aGUgCiAgKiBmb2xsb3dpbmc6CiAgKgotICogIHJpbmZvLnJlcG9ydF90eXBlID0gSElEX1JFUE9SVF9UWVBFX0lOUFVUOwotICogIHJpbmZvLnJlcG9ydF9pZCA9IEhJRF9SRVBPUlRfSURfRklSU1Q7Ci0gKiAgcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOworICogcmluZm8ucmVwb3J0X3R5cGUgPSBISURfUkVQT1JUX1RZUEVfSU5QVVQ7CisgKiByaW5mby5yZXBvcnRfaWQgPSBISURfUkVQT1JUX0lEX0ZJUlNUOworICogcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOwogICoKLSAqICB3aGlsZSAocmV0ID49IDApIHsKLSAqICAgICAgZm9yIChpID0gMDsgaSA8IHJpbmZvLm51bV9maWVsZHM7IGkrKykgeyAKLSAqCSAgICBmaW5mby5yZXBvcnRfdHlwZSA9IHJpbmZvLnJlcG9ydF90eXBlOwotICogICAgICAgICAgZmluZm8ucmVwb3J0X2lkID0gcmluZm8ucmVwb3J0X2lkOwotICogICAgICAgICAgZmluZm8uZmllbGRfaW5kZXggPSBpOwotICogICAgICAgICAgaW9jdGwoZmQsIEhJRElPQ0dGSUVMRElORk8sICZmaW5mbyk7Ci0gKiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmluZm8ubWF4dXNhZ2U7IGorKykgewotICogICAgICAgICAgICAgIHVyZWYuZmllbGRfaW5kZXggPSBpOwotICoJCXVyZWYudXNhZ2VfaW5kZXggPSBqOwotICoJCWlvY3RsKGZkLCBISURJT0NHVUNPREUsICZ1cmVmKTsKLSAqCQlpb2N0bChmZCwgSElESU9DR1VTQUdFLCAmdXJlZik7Ci0gKiAgICAgICAgICB9Ci0gKgl9Ci0gKglyaW5mby5yZXBvcnRfaWQgfD0gSElEX1JFUE9SVF9JRF9ORVhUOwotICoJcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOwotICogIH0KKyAqIHdoaWxlIChyZXQgPj0gMCkgeworICogCWZvciAoaSA9IDA7IGkgPCByaW5mby5udW1fZmllbGRzOyBpKyspIHsKKyAqIAkJZmluZm8ucmVwb3J0X3R5cGUgPSByaW5mby5yZXBvcnRfdHlwZTsKKyAqIAkJZmluZm8ucmVwb3J0X2lkID0gcmluZm8ucmVwb3J0X2lkOworICogCQlmaW5mby5maWVsZF9pbmRleCA9IGk7CisgKiAJCWlvY3RsKGZkLCBISURJT0NHRklFTERJTkZPLCAmZmluZm8pOworICogCQlmb3IgKGogPSAwOyBqIDwgZmluZm8ubWF4dXNhZ2U7IGorKykgeworICogCQkJdXJlZi5yZXBvcnRfdHlwZSA9IHJpbmZvLnJlcG9ydF90eXBlOworICogCQkJdXJlZi5yZXBvcnRfaWQgPSByaW5mby5yZXBvcnRfaWQ7CisgKiAJCQl1cmVmLmZpZWxkX2luZGV4ID0gaTsKKyAqIAkJCXVyZWYudXNhZ2VfaW5kZXggPSBqOworICogCQkJaW9jdGwoZmQsIEhJRElPQ0dVQ09ERSwgJnVyZWYpOworICogCQkJaW9jdGwoZmQsIEhJRElPQ0dVU0FHRSwgJnVyZWYpOworICogCQl9CisgKiAJfQorICogCXJpbmZvLnJlcG9ydF9pZCB8PSBISURfUkVQT1JUX0lEX05FWFQ7CisgKiAJcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOworICogfQogICovCiAKIApAQCAtMjE3LDcgKzIxOSw3IEBACiBzdHJ1Y3QgaGlkX3JlcG9ydDsKIAogI2lmZGVmIENPTkZJR19VU0JfSElEREVWCi1pbnQgaGlkZGV2X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKik7CitpbnQgaGlkZGV2X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IGZvcmNlKTsKIHZvaWQgaGlkZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKik7CiB2b2lkIGhpZGRldl9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCiAJCSAgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSk7CkBAIC0yMjUsNyArMjI3LDkgQEAKIGludCBfX2luaXQgaGlkZGV2X2luaXQodm9pZCk7CiB2b2lkIGhpZGRldl9leGl0KHZvaWQpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGhpZGRldl9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgcmV0dXJuIC0xOyB9CitzdGF0aWMgaW5saW5lIGludCBoaWRkZXZfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLAorCQl1bnNpZ25lZCBpbnQgZm9yY2UpCit7IHJldHVybiAtMTsgfQogc3RhdGljIGlubGluZSB2b2lkIGhpZGRldl9kaXNjb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGhpZGRldl9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCiAJCSAgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkgeyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmggYi9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKaW5kZXggYmYxYTUzYi4uN2YzYzczNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaApAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgogICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgotICoJCUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoJCUFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KICAqCiAgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9mZGRpLmggYi9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaAppbmRleCBhZTc3ZGFlLi40NWRlMTA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaApAQCAtMTIsNyArMTIsNyBAQAogICoJCWlmX2ZkZGkuaCBpcyBiYXNlZCBvbiBwcmV2aW91cyBpZl9ldGhlci5oIGFuZCBpZl90ci5oIHdvcmsgYnkKICAqCQkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CiAgKgkJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgotICoJCQlBbGFuIENveCwgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCQkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KICAqCQkJUGV0ZXIgRGUgU2NocmlqdmVyLCA8c3R1ZDExQGNjNC5rdWxldXZlbi5hYy5iZT4KICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmggYi9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmgKaW5kZXggOTRkMzFjYS4uZjBmMjM1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9oaXBwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaApAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgogICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgotICoJCUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoJCUFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KICAqCQlKZXMgU29yZW5zZW4sIDxKZXMuU29yZW5zZW5AY2Vybi5jaD4KICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL2luY2x1ZGUvbGludXgvaWdtcC5oCmluZGV4IDdiYjNjMDkuLmY3MzRhMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWdtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC0yLDcgKzIsNyBAQAogICoJTGludXggTkVUMzoJSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbCAgW0lHTVBdCiAgKgogICoJQXV0aG9yczoKLSAqCQlBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJRXh0ZW5kZWQgdG8gdGFsayB0aGUgQlNEIGV4dGVuZGVkIElHTVAgcHJvdG9jb2wgb2YgbXJvdXRlZCAzLjYKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAppbmRleCA1OGZmNGU3Li41NGIzNjIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKQEAgLTI1Miw2ICsyNTIsOCBAQAogCUhSVElNRVJfU09GVElSUSwKICNlbmRpZgogCVJDVV9TT0ZUSVJRLCAJLyogUHJlZmVyYWJsZSBSQ1Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbGFzdCBzb2Z0aXJxICovCisKKwlOUl9TT0ZUSVJRUwogfTsKIAogLyogc29mdGlycSBtYXNrIGFuZCBhY3RpdmUgZmllbGRzIG1vdmVkIHRvIGlycV9jcHVzdGF0X3QgaW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmggYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCmluZGV4IGVlOWJjYzYuLmUzOGI2YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaApAQCAtMTY5LDYgKzE2OSw3IEBACiAKIGV4dGVybiB2b2lkIF9fZGV2bV9yZWxlYXNlX3JlZ2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LAogCQkJCSAgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3Qgbik7CitleHRlcm4gaW50IGlvbWVtX21hcF9zYW5pdHlfY2hlY2socmVzb3VyY2Vfc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkvKiBfTElOVVhfSU9QT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IDc1ZDgxZjEuLjk2ODc0OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMjEzLDYgKzIxMyw5IEBACiAJCXsgcmV0dXJuIGZhbHNlOyB9CiAjZW5kaWYKIAorZXh0ZXJuIGludCBwcmludGtfbmVlZHNfY3B1KGludCBjcHUpOworZXh0ZXJuIHZvaWQgcHJpbnRrX3RpY2sodm9pZCk7CisKIGV4dGVybiB2b2lkIGFzbWxpbmthZ2UgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKQogCWVhcmx5X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKaW5kZXggM2QyNWJjZC4uZTU4NzJkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKQEAgLTI3LDcgKzI3LDYgQEAKIAkJCQkJCXN0cnVjdCBuZnNfZmggKiwKIAkJCQkJCXN0cnVjdCBmaWxlICoqKTsKIAl2b2lkCQkJKCpmY2xvc2UpKHN0cnVjdCBmaWxlICopOwotCXVuc2lnbmVkIGxvbmcJCSgqZ2V0X2dyYWNlX3BlcmlvZCkodm9pZCk7CiB9OwogCiBleHRlcm4gc3RydWN0IG5sbXN2Y19iaW5kaW5nICoJbmxtc3ZjX29wczsKQEAgLTUzLDE1ICs1Miw3IEBACiAKIGV4dGVybiBpbnQJbmxtY2xudF9wcm9jKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgaW50IGNtZCwKIAkJCQkJc3RydWN0IGZpbGVfbG9jayAqZmwpOwotZXh0ZXJuIGludAlsb2NrZF91cChpbnQgcHJvdG8pOworZXh0ZXJuIGludAlsb2NrZF91cCh2b2lkKTsKIGV4dGVybiB2b2lkCWxvY2tkX2Rvd24odm9pZCk7CiAKLXVuc2lnbmVkIGxvbmcgZ2V0X25mc19ncmFjZV9wZXJpb2Qodm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfTkZTRF9WNAotdW5zaWduZWQgbG9uZyBnZXRfbmZzNF9ncmFjZV9wZXJpb2Qodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9uZnM0X2dyYWNlX3BlcmlvZCh2b2lkKSB7cmV0dXJuIDA7fQotI2VuZGlmCi0KICNlbmRpZiAvKiBMSU5VWF9MT0NLRF9CSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAppbmRleCBkYmI4N2FiLi5iNTZkNWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCkBAIC0xMiw2ICsxMiw4IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KQEAgLTM4LDggKzQwLDkgQEAKICAqLwogc3RydWN0IG5sbV9ob3N0IHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQloX2hhc2g7CQkvKiBkb3VibHkgbGlua2VkIGxpc3QgKi8KLQlzdHJ1Y3Qgc29ja2FkZHJfaW4JaF9hZGRyOwkJLyogcGVlciBhZGRyZXNzICovCi0Jc3RydWN0IHNvY2thZGRyX2luCWhfc2FkZHI7CS8qIG91ciBhZGRyZXNzIChvcHRpb25hbCkgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQloX2FkZHI7CQkvKiBwZWVyIGFkZHJlc3MgKi8KKwlzaXplX3QJCQloX2FkZHJsZW47CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UJaF9zcmNhZGRyOwkvKiBvdXIgYWRkcmVzcyAob3B0aW9uYWwpICovCiAJc3RydWN0IHJwY19jbG50CSoJaF9ycGNjbG50OwkvKiBSUEMgY2xpZW50IHRvIHRhbGsgdG8gcGVlciAqLwogCWNoYXIgKgkJCWhfbmFtZTsJCS8qIHJlbW90ZSBob3N0bmFtZSAqLwogCXUzMgkJCWhfdmVyc2lvbjsJLyogaW50ZXJmYWNlIHZlcnNpb24gKi8KQEAgLTYxLDE4ICs2NCw1NiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJaF9ncmFudGVkOwkvKiBMb2NrcyBpbiBHUkFOVEVEIHN0YXRlICovCiAJc3RydWN0IGxpc3RfaGVhZAloX3JlY2xhaW07CS8qIExvY2tzIGluIFJFQ0xBSU0gc3RhdGUgKi8KIAlzdHJ1Y3QgbnNtX2hhbmRsZSAqCWhfbnNtaGFuZGxlOwkvKiBOU00gc3RhdHVzIGhhbmRsZSAqLworCisJY2hhcgkJCWhfYWRkcmJ1Zls0OF0sCS8qIGFkZHJlc3MgZXllY2F0Y2hlcnMgKi8KKwkJCQloX3NyY2FkZHJidWZbNDhdOwogfTsKIAogc3RydWN0IG5zbV9oYW5kbGUgewogCXN0cnVjdCBsaXN0X2hlYWQJc21fbGluazsKIAlhdG9taWNfdAkJc21fY291bnQ7CiAJY2hhciAqCQkJc21fbmFtZTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc21fYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQlzbV9hZGRyOworCXNpemVfdAkJCXNtX2FkZHJsZW47CiAJdW5zaWduZWQgaW50CQlzbV9tb25pdG9yZWQgOiAxLAogCQkJCXNtX3N0aWNreSA6IDE7CS8qIGRvbid0IHVubW9uaXRvciAqLworCWNoYXIJCQlzbV9hZGRyYnVmWzQ4XTsJLyogYWRkcmVzcyBleWVjYXRjaGVyICovCiB9OwogCiAvKgorICogUmlnb3JvdXMgdHlwZSBjaGVja2luZyBvbiBzb2NrYWRkciB0eXBlIGNvbnZlcnNpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyX2luICpubG1fYWRkcl9pbihjb25zdCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaG9zdC0+aF9hZGRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkciAqbmxtX2FkZHIoY29uc3Qgc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXJldHVybiAoc3RydWN0IHNvY2thZGRyICopJmhvc3QtPmhfYWRkcjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHJfaW4gKm5sbV9zcmNhZGRyX2luKGNvbnN0IHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZob3N0LT5oX3NyY2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyICpubG1fc3JjYWRkcihjb25zdCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikmaG9zdC0+aF9zcmNhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkcl9pbiAqbnNtX2FkZHJfaW4oY29uc3Qgc3RydWN0IG5zbV9oYW5kbGUgKmhhbmRsZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZoYW5kbGUtPnNtX2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyICpuc21fYWRkcihjb25zdCBzdHJ1Y3QgbnNtX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiAoc3RydWN0IHNvY2thZGRyICopJmhhbmRsZS0+c21fYWRkcjsKK30KKworLyoKICAqIE1hcCBhbiBmbF9vd25lcl90IGludG8gYSB1bmlxdWUgMzItYml0ICJwaWQiCiAgKi8KIHN0cnVjdCBubG1fbG9ja293bmVyIHsKQEAgLTE2Niw3ICsyMDcsOCBAQAogc3RydWN0IG5sbV93YWl0ICogbmxtY2xudF9wcmVwYXJlX2Jsb2NrKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogdm9pZAkJICBubG1jbG50X2ZpbmlzaF9ibG9jayhzdHJ1Y3QgbmxtX3dhaXQgKmJsb2NrKTsKIGludAkJICBubG1jbG50X2Jsb2NrKHN0cnVjdCBubG1fd2FpdCAqYmxvY2ssIHN0cnVjdCBubG1fcnFzdCAqcmVxLCBsb25nIHRpbWVvdXQpOwotX19iZTMyCQkgIG5sbWNsbnRfZ3JhbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyLCBjb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKik7CitfX2JlMzIJCSAgbmxtY2xudF9ncmFudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisJCQkJY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrKTsKIHZvaWQJCSAgbmxtY2xudF9yZWNvdmVyeShzdHJ1Y3QgbmxtX2hvc3QgKik7CiBpbnQJCSAgbmxtY2xudF9yZWNsYWltKHN0cnVjdCBubG1faG9zdCAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOwogdm9pZAkJICBubG1jbG50X25leHRfY29va2llKHN0cnVjdCBubG1fY29va2llICopOwpAQCAtMTc0LDEyICsyMTYsMTQgQEAKIC8qCiAgKiBIb3N0IGNhY2hlCiAgKi8KLXN0cnVjdCBubG1faG9zdCAgKm5sbWNsbnRfbG9va3VwX2hvc3QoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCi0JCQkJCWludCBwcm90bywgdTMyIHZlcnNpb24sCitzdHJ1Y3QgbmxtX2hvc3QgICpubG1jbG50X2xvb2t1cF9ob3N0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCQljb25zdCBzaXplX3Qgc2FsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJCQljb25zdCB1MzIgdmVyc2lvbiwKKwkJCQkJY29uc3QgY2hhciAqaG9zdG5hbWUpOworc3RydWN0IG5sbV9ob3N0ICAqbmxtc3ZjX2xvb2t1cF9ob3N0KGNvbnN0IHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLAotCQkJCQl1bnNpZ25lZCBpbnQgaG9zdG5hbWVfbGVuKTsKLXN0cnVjdCBubG1faG9zdCAgKm5sbXN2Y19sb29rdXBfaG9zdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgY29uc3QgY2hhciAqLAotCQkJCQl1bnNpZ25lZCBpbnQpOworCQkJCQljb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuKTsKIHN0cnVjdCBycGNfY2xudCAqIG5sbV9iaW5kX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwogdm9pZAkJICBubG1fcmViaW5kX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwogc3RydWN0IG5sbV9ob3N0ICogbmxtX2dldF9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKQEAgLTIwMSw3ICsyNDUsNyBAQAogICovCiBfX2JlMzIJCSAgbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBubG1fZmlsZSAqLAogCQkJICAgICAgc3RydWN0IG5sbV9ob3N0ICosIHN0cnVjdCBubG1fbG9jayAqLCBpbnQsCi0JCQkgICAgICBzdHJ1Y3QgbmxtX2Nvb2tpZSAqKTsKKwkJCSAgICAgIHN0cnVjdCBubG1fY29va2llICosIGludCk7CiBfX2JlMzIJCSAgbmxtc3ZjX3VubG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKiwgc3RydWN0IG5sbV9sb2NrICopOwogX19iZTMyCQkgIG5sbXN2Y190ZXN0bG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IG5sbV9maWxlICosCiAJCQlzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9sb2NrICosCkBAIC0yMzMsMTUgKzI3Nyw4MiBAQAogCXJldHVybiBmaWxlLT5mX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiB9CiAKLS8qCi0gKiBDb21wYXJlIHR3byBob3N0IGFkZHJlc3NlcyAobmVlZHMgbW9kaWZ5aW5nIGZvciBpcHY2KQotICovCi1zdGF0aWMgaW5saW5lIGludCBubG1fY21wX2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4xLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luMikKK3N0YXRpYyBpbmxpbmUgaW50IF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCiB7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOworCXJldHVybiAoc2luLT5zaW5fYWRkci5zX2FkZHIgPT0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSkgJiYKKwkJCShudG9ocyhzaW4tPnNpbl9wb3J0KSA8IDEwMjQpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCitzdGF0aWMgaW5saW5lIGludCBfX25sbV9wcml2aWxlZ2VkX3JlcXVlc3Q2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKKwlyZXR1cm4gKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xPT1BCQUNLKSAmJgorCQkJKG50b2hzKHNpbjYtPnNpbjZfcG9ydCkgPCAxMDI0KTsKK30KKyNlbHNlCS8qIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKSAqLworc3RhdGljIGlubGluZSBpbnQgX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0Nihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkgKi8KKworLyoKKyAqIEVuc3VyZSBpbmNvbWluZyByZXF1ZXN0cyBhcmUgZnJvbSBsb2NhbCBwcml2aWxlZ2VkIGNhbGxlcnMuCisgKgorICogUmV0dXJuIFRSVUUgaWYgc2VuZGVyIGlzIGxvY2FsIGFuZCBpcyBjb25uZWN0aW5nIHZpYSBhIHByaXZpbGVnZWQgcG9ydDsKKyAqIG90aGVyd2lzZSByZXR1cm4gRkFMU0UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5sbV9wcml2aWxlZ2VkX3JlcXVlc3Rlcihjb25zdCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwID0gc3ZjX2FkZHIocnFzdHApOworCisJc3dpdGNoIChzYXAtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDQoc2FwKTsKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0NihzYXApOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgX19ubG1fY21wX2FkZHI0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjEgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopc2FwMTsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjIgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopc2FwMjsKIAlyZXR1cm4gc2luMS0+c2luX2FkZHIuc19hZGRyID09IHNpbjItPnNpbl9hZGRyLnNfYWRkcjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgX19ubG1fY21wX2FkZHI2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW4xID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYXAxOworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjIgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDI7CisJcmV0dXJuIGlwdjZfYWRkcl9lcXVhbCgmc2luMS0+c2luNl9hZGRyLCAmc2luMi0+c2luNl9hZGRyKTsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIGhvc3QgYWRkcmVzc2VzCisgKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIGFkZHJlc3NlcyBhcmUgdGhlIHNhbWU7IG90aGVyd2lzZSBGQUxTRS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmxtX2NtcF9hZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcDIpCit7CisJaWYgKHNhcDEtPnNhX2ZhbWlseSA9PSBzYXAyLT5zYV9mYW1pbHkpIHsKKwkJc3dpdGNoIChzYXAxLT5zYV9mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJcmV0dXJuIF9fbmxtX2NtcF9hZGRyNChzYXAxLCBzYXAyKTsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCXJldHVybiBfX25sbV9jbXBfYWRkcjYoc2FwMSwgc2FwMik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBDb21wYXJlIHR3byBOTE0gbG9ja3MuCiAgKiBXaGVuIHRoZSBzZWNvbmQgbG9jayBpcyBvZiB0eXBlIEZfVU5MQ0ssIHRoaXMgYWN0cyBsaWtlIGEgd2lsZGNhcmQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaAppbmRleCBkZjE4ZmEwLi5kNmIzYTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmgKQEAgLTgxLDggKzgxLDYgQEAKIAl1bnNpZ25lZCBpbnQJbGVuOwogCXUzMgkJc3RhdGU7CiAJX19iZTMyCQlhZGRyOwotCV9fYmUzMgkJdmVyczsKLQlfX2JlMzIJCXByb3RvOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9hdWRpby5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9hdWRpby5oCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogYXVkaW8uaCAgLS0gIEF1ZGlvIERyaXZlciBmb3IgV29sZnNvbiBXTTgzNTAgUE1JQworICoKKyAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9XTTgzNTBfQVVESU9fSF8KKyNkZWZpbmUgX19MSU5VWF9NRkRfV004MzUwX0FVRElPX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBXTTgzNTBfQ0xPQ0tfQ09OVFJPTF8xICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBXTTgzNTBfQ0xPQ0tfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBXTTgzNTBfRkxMX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAgMHgyQQorI2RlZmluZSBXTTgzNTBfRkxMX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSBXTTgzNTBfRkxMX0NPTlRST0xfMyAgICAgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBXTTgzNTBfRkxMX0NPTlRST0xfNCAgICAgICAgICAgICAgICAgICAgMHgyRAorI2RlZmluZSBXTTgzNTBfREFDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBXTTgzNTBfREFDX0RJR0lUQUxfVk9MVU1FX0wgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBXTTgzNTBfREFDX0RJR0lUQUxfVk9MVU1FX1IgICAgICAgICAgICAgMHgzMworI2RlZmluZSBXTTgzNTBfREFDX0xSX1JBVEUgICAgICAgICAgICAgICAgICAgICAgMHgzNQorI2RlZmluZSBXTTgzNTBfREFDX0NMT0NLX0NPTlRST0wgICAgICAgICAgICAgICAgMHgzNgorI2RlZmluZSBXTTgzNTBfREFDX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQQorI2RlZmluZSBXTTgzNTBfREFDX01VVEVfVk9MVU1FICAgICAgICAgICAgICAgICAgMHgzQgorI2RlZmluZSBXTTgzNTBfREFDX1NJREUgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQworI2RlZmluZSBXTTgzNTBfQURDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBXTTgzNTBfQURDX0RJR0lUQUxfVk9MVU1FX0wgICAgICAgICAgICAgMHg0MgorI2RlZmluZSBXTTgzNTBfQURDX0RJR0lUQUxfVk9MVU1FX1IgICAgICAgICAgICAgMHg0MworI2RlZmluZSBXTTgzNTBfQURDX0RJVklERVIgICAgICAgICAgICAgICAgICAgICAgMHg0NAorI2RlZmluZSBXTTgzNTBfQURDX0xSX1JBVEUgICAgICAgICAgICAgICAgICAgICAgMHg0NgorI2RlZmluZSBXTTgzNTBfSU5QVVRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHg0OAorI2RlZmluZSBXTTgzNTBfSU4zX0lOUFVUX0NPTlRST0wgICAgICAgICAgICAgICAgMHg0OQorI2RlZmluZSBXTTgzNTBfTUlDX0JJQVNfQ09OVFJPTCAgICAgICAgICAgICAgICAgMHg0QQorI2RlZmluZSBXTTgzNTBfT1VUUFVUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgMHg0QworI2RlZmluZSBXTTgzNTBfSkFDS19ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgMHg0RAorI2RlZmluZSBXTTgzNTBfQU5USV9QT1BfQ09OVFJPTCAgICAgICAgICAgICAgICAgMHg0RQorI2RlZmluZSBXTTgzNTBfTEVGVF9JTlBVVF9WT0xVTUUgICAgICAgICAgICAgICAgMHg1MAorI2RlZmluZSBXTTgzNTBfUklHSFRfSU5QVVRfVk9MVU1FICAgICAgICAgICAgICAgMHg1MQorI2RlZmluZSBXTTgzNTBfTEVGVF9NSVhFUl9DT05UUk9MICAgICAgICAgICAgICAgMHg1OAorI2RlZmluZSBXTTgzNTBfUklHSFRfTUlYRVJfQ09OVFJPTCAgICAgICAgICAgICAgMHg1OQorI2RlZmluZSBXTTgzNTBfT1VUM19NSVhFUl9DT05UUk9MICAgICAgICAgICAgICAgMHg1QworI2RlZmluZSBXTTgzNTBfT1VUNF9NSVhFUl9DT05UUk9MICAgICAgICAgICAgICAgMHg1RAorI2RlZmluZSBXTTgzNTBfT1VUUFVUX0xFRlRfTUlYRVJfVk9MVU1FICAgICAgICAgMHg2MAorI2RlZmluZSBXTTgzNTBfT1VUUFVUX1JJR0hUX01JWEVSX1ZPTFVNRSAgICAgICAgMHg2MQorI2RlZmluZSBXTTgzNTBfSU5QVVRfTUlYRVJfVk9MVU1FX0wgICAgICAgICAgICAgMHg2MgorI2RlZmluZSBXTTgzNTBfSU5QVVRfTUlYRVJfVk9MVU1FX1IgICAgICAgICAgICAgMHg2MworI2RlZmluZSBXTTgzNTBfSU5QVVRfTUlYRVJfVk9MVU1FICAgICAgICAgICAgICAgMHg2NAorI2RlZmluZSBXTTgzNTBfTE9VVDFfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHg2OAorI2RlZmluZSBXTTgzNTBfUk9VVDFfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHg2OQorI2RlZmluZSBXTTgzNTBfTE9VVDJfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHg2QQorI2RlZmluZSBXTTgzNTBfUk9VVDJfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHg2QgorI2RlZmluZSBXTTgzNTBfQkVFUF9WT0xVTUUgICAgICAgICAgICAgICAgICAgICAgMHg2RgorI2RlZmluZSBXTTgzNTBfQUlfRk9STUFUSU5HICAgICAgICAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBXTTgzNTBfQURDX0RBQ19DT01QICAgICAgICAgICAgICAgICAgICAgMHg3MQorI2RlZmluZSBXTTgzNTBfQUlfQURDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgMHg3MgorI2RlZmluZSBXTTgzNTBfQUlfREFDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgMHg3MworI2RlZmluZSBXTTgzNTBfQUlGX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NAorI2RlZmluZSBXTTgzNTBfSkFDS19QSU5fU1RBVFVTICAgICAgICAgICAgICAgICAgMHhFNworCisvKiBCaXQgdmFsdWVzIGZvciBSMDggKDB4MDgpICovCisjZGVmaW5lIFdNODM1MF9DT0RFQ19JU0VMXzFfNSAgICAgICAgICAgICAgICAgICAwCS8qIHgxLjUgKi8KKyNkZWZpbmUgV004MzUwX0NPREVDX0lTRUxfMV8wICAgICAgICAgICAgICAgICAgIDEJLyogeDEuMCAqLworI2RlZmluZSBXTTgzNTBfQ09ERUNfSVNFTF8wXzc1ICAgICAgICAgICAgICAgICAgMgkvKiB4MC43NSAqLworI2RlZmluZSBXTTgzNTBfQ09ERUNfSVNFTF8wXzUgICAgICAgICAgICAgICAgICAgMwkvKiB4MC41ICovCisKKyNkZWZpbmUgV004MzUwX1ZNSURfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1ZNSURfNTAwSyAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX1ZNSURfMTAwSyAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX1ZNSURfMTBLICAgICAgICAgICAgICAgICAgICAgICAgIDMKKworLyoKKyAqIFI0MCAoMHgyOCkgLSBDbG9jayBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTgzNTBfVE9DTEtfUkFURSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9NQ0xLX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX01DTEtfRElWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEYwCisjZGVmaW5lIFdNODM1MF9PUENMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDcKKworLyoKKyAqIFI0MSAoMHgyOSkgLSBDbG9jayBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTgzNTBfTFJDX0FEQ19TRUwgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9NQ0xLX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFI0MiAoMHgyQSkgLSBGTEwgQ29udHJvbCAxCisgKi8KKyNkZWZpbmUgV004MzUwX0ZMTF9ESVRIRVJfV0lEVEhfTUFTSyAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBXTTgzNTBfRkxMX0RJVEhFUl9IUCAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9GTExfT1VURElWX01BU0sgICAgICAgICAgICAgICAgICAweDA3MDAKKyNkZWZpbmUgV004MzUwX0ZMTF9SU1BfUkFURV9NQVNLICAgICAgICAgICAgICAgIDB4MDBGMAorI2RlZmluZSBXTTgzNTBfRkxMX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA3CisKKy8qCisgKiBSNDMgKDB4MkIpIC0gRkxMIENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNODM1MF9GTExfUkFUSU9fTUFTSyAgICAgICAgICAgICAgICAgICAweEY4MDAKKyNkZWZpbmUgV004MzUwX0ZMTF9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDNGRgorCisvKgorICogUjQ0ICgweDJDKSAtIEZMTCBDb250cm9sIDMKKyAqLworI2RlZmluZSBXTTgzNTBfRkxMX0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGCisKKy8qCisgKiBSNDUgKDB4MkQpIC0gRkxMIENvbnRyb2wgNAorICovCisjZGVmaW5lIFdNODM1MF9GTExfRlJBQyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0ZMTF9TTE9XX0xPQ0tfUkVGICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfRkxMX0NMS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzCisKKy8qCisgKiBSNDggKDB4MzApIC0gREFDIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREFDX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9BSUZfTFJDTEtSQVRFICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RFRU1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBXTTgzNTBfREFDTF9EQVRJTlYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9EQUNSX0RBVElOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFI1MCAoMHgzMikgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTAorICovCisjZGVmaW5lIFdNODM1MF9EQUNfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0RBQ0xfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRgorCisvKgorICogUjUxICgweDMzKSAtIERBQyBEaWdpdGFsIFZvbHVtZSBSCisgKi8KKyNkZWZpbmUgV004MzUwX0RBQ19WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfREFDUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGCisKKy8qCisgKiBSNTMgKDB4MzUpIC0gREFDIExSIFJhdGUKKyAqLworI2RlZmluZSBXTTgzNTBfREFDTFJDX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9EQUNMUkNfUkFURV9NQVNLICAgICAgICAgICAgICAgICAweDA3RkYKKworLyoKKyAqIFI1NCAoMHgzNikgLSBEQUMgQ2xvY2sgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQUNDTEtfUE9MICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0RBQ19DTEtESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwNworCisvKgorICogUjU4ICgweDNBKSAtIERBQyBNdXRlCisgKi8KKyNkZWZpbmUgV004MzUwX0RBQ19NVVRFX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorCisvKgorICogUjU5ICgweDNCKSAtIERBQyBNdXRlIFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9EQUNfTVVURU1PREUgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0RBQ19NVVRFUkFURSAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfREFDX1NCX0ZJTFQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisKKy8qCisgKiBSNjAgKDB4M0MpIC0gREFDIFNpZGUKKyAqLworI2RlZmluZSBXTTgzNTBfQURDX1RPX0RBQ0xfTUFTSyAgICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIFdNODM1MF9BRENfVE9fREFDUl9NQVNLICAgICAgICAgICAgICAgICAweDBDMDAKKworLyoKKyAqIFI2NCAoMHg0MCkgLSBBREMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9BRENfSFBGX0NVVF9NQVNLICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0FEQ0xfREFUSU5WICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfQURDUl9EQVRJTlYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSNjYgKDB4NDIpIC0gQURDIERpZ2l0YWwgVm9sdW1lIEwKKyAqLworI2RlZmluZSBXTTgzNTBfQURDX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9BRENMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYKKworLyoKKyAqIFI2NyAoMHg0MykgLSBBREMgRGlnaXRhbCBWb2x1bWUgUgorICovCisjZGVmaW5lIFdNODM1MF9BRENfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0FEQ1JfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRgorCisvKgorICogUjY4ICgweDQ0KSAtIEFEQyBEaXZpZGVyCisgKi8KKyNkZWZpbmUgV004MzUwX0FEQ0xfREFDX1NWT0xfTUFTSyAgICAgICAgICAgICAgIDB4MEYwMAorI2RlZmluZSBXTTgzNTBfQURDUl9EQUNfU1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEYwCisjZGVmaW5lIFdNODM1MF9BRENDTEtfUE9MICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0FEQ19DTEtESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwNworCisvKgorICogUjcwICgweDQ2KSAtIEFEQyBMUiBSYXRlCisgKi8KKyNkZWZpbmUgV004MzUwX0FEQ0xSQ19FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfQURDTFJDX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgMHgwN0ZGCisKKy8qCisgKiBSNzIgKDB4NDgpIC0gSW5wdXQgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9JTjJSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0lOMVJOX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfSU4xUlBfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9JTjJMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0lOMUxOX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfSU4xTFBfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSNzMgKDB4NDkpIC0gSU4zIElucHV0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfSU4zUl9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9JTjNMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKworLyoKKyAqIFI3NCAoMHg0QSkgLSBNaWMgQmlhcyBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX01JQ0JTRUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfTUNEVEhSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDFDCisjZGVmaW5lIFdNODM1MF9NQ0RTQ1RIUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDMKKworLyoKKyAqIFI3NiAoMHg0QykgLSBPdXRwdXQgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9PVVQ0X1ZST0kgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX09VVDNfVlJPSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfT1VUMl9WUk9JICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9PVVQxX1ZST0kgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX09VVDJfRkIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfT1VUMV9GQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSNzcgKDB4NEQpIC0gSmFjayBEZXRlY3QKKyAqLworI2RlZmluZSBXTTgzNTBfSkRMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9KRFJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKworLyoKKyAqIFI3OCAoMHg0RSkgLSBBbnRpIFBvcCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0FOVElfUE9QX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfRElTX09QX0xONF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMEMwCisjZGVmaW5lIFdNODM1MF9ESVNfT1BfTE4zX01BU0sgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0RJU19PUF9PVVQyX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBXTTgzNTBfRElTX09QX09VVDFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzCisKKy8qCisgKiBSODAgKDB4NTApIC0gTGVmdCBJbnB1dCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfSU5MX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9JTkxfWkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0lOX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfSU5MX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMEZDCisKKy8qCisgKiBSODEgKDB4NTEpIC0gUmlnaHQgSW5wdXQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004MzUwX0lOUl9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfSU5SX1pDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0lOUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDBGQworCisvKgorICogUjg4ICgweDU4KSAtIExlZnQgTWl4ZXIgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQUNSX1RPX01JWE9VVEwgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RBQ0xfVE9fTUlYT1VUTCAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfSU4zTF9UT19NSVhPVVRMICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTlJfVE9fTUlYT1VUTCAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lOTF9UT19NSVhPVVRMICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjg5ICgweDU5KSAtIFJpZ2h0IE1peGVyIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREFDUl9UT19NSVhPVVRSICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9EQUNMX1RPX01JWE9VVFIgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0lOM1JfVE9fTUlYT1VUUiAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfSU5SX1RPX01JWE9VVFIgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JTkxfVE9fTUlYT1VUUiAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFI5MiAoMHg1QykgLSBPVVQzIE1peGVyIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREFDTF9UT19PVVQzICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9NSVhJTkxfVE9fT1VUMyAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX09VVDRfVE9fT1VUMyAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfTUlYT1VUTF9UT19PVVQzICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSOTMgKDB4NUQpIC0gT1VUNCBNaXhlciBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RBQ1JfVE9fT1VUNCAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfREFDTF9UT19PVVQ0ICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9PVVQ0X0FUVE4gICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX01JWElOUl9UT19PVVQ0ICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfT1VUM19UT19PVVQ0ICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9NSVhPVVRSX1RPX09VVDQgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX01JWE9VVExfVE9fT1VUNCAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjk2ICgweDYwKSAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9JTjNMX01JWE9VVExfVk9MX01BU0sgICAgICAgICAgICAweDBFMDAKKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYT1VUTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVExfVk9MX01BU0sgICAgICAgICAgICAgMHgwMEUwCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF9NQVNLICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVExfVk9MX1NISUZUICAgICAgICAgICAgICAgICAxCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFI5NiAoMHg2MCkgKi8KKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYT1VUTF9WT0xfT0ZGICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfSU4zTF9NSVhPVVRMX1ZPTF9NMTJEQiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9JTjNMX01JWE9VVExfVk9MX005REIgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYT1VUTF9WT0xfTTZEQiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfSU4zTF9NSVhPVVRMX1ZPTF9NM0RCICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9JTjNMX01JWE9VVExfVk9MXzBEQiAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYT1VUTF9WT0xfM0RCICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfSU4zTF9NSVhPVVRMX1ZPTF82REIgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRMX1ZPTF9PRkYgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVExfVk9MX00xMkRCICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUTF9WT0xfTTlEQiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRMX1ZPTF9NNkRCICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVExfVk9MX00zREIgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUTF9WT0xfMERCICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRMX1ZPTF8zREIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVExfVk9MXzZEQiAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF9PRkYgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVExfVk9MX00xMkRCICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUTF9WT0xfTTlEQiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF9NNkRCICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVExfVk9MX00zREIgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUTF9WT0xfMERCICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF8zREIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVExfVk9MXzZEQiAgICAgICAgICAgICAgICAgICA3CisKKy8qCisgKiBSOTcgKDB4NjEpIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9JTjNSX01JWE9VVFJfVk9MX01BU0sgICAgICAgICAgICAweEUwMDAKKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYT1VUUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAxMworI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVFJfVk9MX01BU0sgICAgICAgICAgICAgMHgwMEUwCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF9NQVNLICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVFJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAxCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFI5NiAoMHg2MCkgKi8KKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYT1VUUl9WT0xfT0ZGICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfSU4zUl9NSVhPVVRSX1ZPTF9NMTJEQiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9JTjNSX01JWE9VVFJfVk9MX005REIgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYT1VUUl9WT0xfTTZEQiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfSU4zUl9NSVhPVVRSX1ZPTF9NM0RCICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9JTjNSX01JWE9VVFJfVk9MXzBEQiAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYT1VUUl9WT0xfM0RCICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfSU4zUl9NSVhPVVRSX1ZPTF82REIgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRSX1ZPTF9PRkYgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVFJfVk9MX00xMkRCICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUUl9WT0xfTTlEQiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRSX1ZPTF9NNkRCICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVFJfVk9MX00zREIgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUUl9WT0xfMERCICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRSX1ZPTF8zREIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVFJfVk9MXzZEQiAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF9PRkYgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVFJfVk9MX00xMkRCICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUUl9WT0xfTTlEQiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF9NNkRCICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVFJfVk9MX00zREIgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUUl9WT0xfMERCICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF8zREIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVFJfVk9MXzZEQiAgICAgICAgICAgICAgICAgICA3CisKKy8qCisgKiBSOTggKDB4NjIpIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIEwKKyAqLworI2RlZmluZSBXTTgzNTBfSU4zTF9NSVhJTkxfVk9MX01BU0sgICAgICAgICAgICAgMHgwRTAwCisjZGVmaW5lIFdNODM1MF9JTjJMX01JWElOTF9WT0xfTUFTSyAgICAgICAgICAgICAweDAwMEUKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhJTkxfVk9MICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjk5ICgweDYzKSAtIElucHV0IE1peGVyIFZvbHVtZSBSCisgKi8KKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYSU5SX1ZPTF9NQVNLICAgICAgICAgICAgIDB4RTAwMAorI2RlZmluZSBXTTgzNTBfSU4yUl9NSVhJTlJfVk9MX01BU0sgICAgICAgICAgICAgMHgwMEUwCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYSU5SX1ZPTCAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMDAgKDB4NjQpIC0gSW5wdXQgTWl4ZXIgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004MzUwX09VVDRfTUlYSU5fRFNUICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfT1VUNF9NSVhJTl9WT0xfTUFTSyAgICAgICAgICAgICAgMHgwMDBFCisKKy8qCisgKiBSMTA0ICgweDY4KSAtIExPVVQxIFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9PVVQxTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX09VVDFMX1pDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfT1VUMV9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9PVVQxTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkMKKyNkZWZpbmUgV004MzUwX09VVDFMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKgorICogUjEwNSAoMHg2OSkgLSBST1VUMSBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfT1VUMVJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9PVVQxUl9aQyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX09VVDFfVlUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfT1VUMVJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZDCisjZGVmaW5lIFdNODM1MF9PVVQxUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIxMDYgKDB4NkEpIC0gTE9VVDIgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004MzUwX09VVDJMX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfT1VUMkxfWkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9PVVQyX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX09VVDJMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGQworCisvKgorICogUjEwNyAoMHg2QikgLSBST1VUMiBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfT1VUMlJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9PVVQyUl9aQyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX09VVDJSX0lOViAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfT1VUMlJfSU5WX01VVEUgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9PVVQyX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX09VVDJSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGQworCisvKgorICogUjExMSAoMHg2RikgLSBCRUVQIFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9JTjNSX09VVDJSX1ZPTF9NQVNLICAgICAgICAgICAgICAweDAwRTAKKworLyoKKyAqIFIxMTIgKDB4NzApIC0gQUkgRm9ybWF0aW5nCisgKi8KKyNkZWZpbmUgV004MzUwX0FJRl9CQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfQUlGX1RSSSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9BSUZfTFJDTEtfSU5WICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0FJRl9XTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MEMwMAorI2RlZmluZSBXTTgzNTBfQUlGX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCisKKy8qCisgKiBSMTEzICgweDcxKSAtIEFEQyBEQUMgQ09NUAorICovCisjZGVmaW5lIFdNODM1MF9EQUNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0RBQ19DT01QTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfQURDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9BRENfQ09NUE1PREUgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjExNCAoMHg3MikgLSBBSSBBREMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9BSUZBRENfUEQgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0FJRkFEQ0xfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfQUlGQURDUl9TUkMgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9BSUZBRENfVERNX0NIQU4gICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0FJRkFEQ19URE0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorCisvKgorICogUjExNSAoMHg3MykgLSBBSSBEQUMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9CQ0xLX01TVFIgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0FJRkRBQ19QRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfREFDTF9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9EQUNSX1NSQyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0FJRkRBQ19URE1fQ0hBTiAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfQUlGREFDX1RETSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9EQUNfQk9PU1RfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMKKworLyoKKyAqIFIxMTYgKDB4NzQpIC0gQUlGIFRlc3QKKyAqLworI2RlZmluZSBXTTgzNTBfQ09ERUNfQllQICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9BSUZBRENfV1JfVFNUICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0FJRkFEQ19SRF9UU1QgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQUlGREFDX1dSX1RTVCAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9BSUZEQUNfUkRfVFNUICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0FJRkFEQ19BU1lOICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQUlGREFDX0FTWU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisKKy8qCisgKiBSMjMxICgweEU3KSAtIEphY2sgU3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX0pBQ0tfUl9MVkwgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorCisvKgorICogV004MzUwIFBsYXRmb3JtIHNldHVwCisgKi8KKyNkZWZpbmUgV004MzUwX1NfQ1VSVkVfTk9ORQkJCTB4MAorI2RlZmluZSBXTTgzNTBfU19DVVJWRV9GQVNUCQkJMHgxCisjZGVmaW5lIFdNODM1MF9TX0NVUlZFX01FRElVTQkJCTB4MgorI2RlZmluZSBXTTgzNTBfU19DVVJWRV9TTE9XCQkJMHgzCisKKyNkZWZpbmUgV004MzUwX0RJU0NIQVJHRV9PRkYJCQkweDAKKyNkZWZpbmUgV004MzUwX0RJU0NIQVJHRV9GQVNUCQkJMHgxCisjZGVmaW5lIFdNODM1MF9ESVNDSEFSR0VfTUVESVVNCQkJMHgyCisjZGVmaW5lIFdNODM1MF9ESVNDSEFSR0VfU0xPVwkJCTB4MworCisjZGVmaW5lIFdNODM1MF9USUVfT0ZGXzUwMFIJCQkweDAKKyNkZWZpbmUgV004MzUwX1RJRV9PRkZfMzBLCQkJMHgxCisKKy8qCisgKiBDbG9jayBzb3VyY2VzICYgZGlyZWN0aW9ucworICovCisjZGVmaW5lIFdNODM1MF9TWVNDTEsJCQkJMAorCisjZGVmaW5lIFdNODM1MF9NQ0xLX1NFTF9QTExfTUNMSwkJMAorI2RlZmluZSBXTTgzNTBfTUNMS19TRUxfUExMX0RBQwkJCTEKKyNkZWZpbmUgV004MzUwX01DTEtfU0VMX1BMTF9BREMJCQkyCisjZGVmaW5lIFdNODM1MF9NQ0xLX1NFTF9QTExfMzJLCQkJMworI2RlZmluZSBXTTgzNTBfTUNMS19TRUxfTUNMSwkJCTUKKworI2RlZmluZSBXTTgzNTBfTUNMS19ESVJfT1VUCQkJMAorI2RlZmluZSBXTTgzNTBfTUNMS19ESVJfSU4JCQkxCisKKy8qIGNsb2NrIGRpdmlkZXIgaWQncyAqLworI2RlZmluZSBXTTgzNTBfQURDX0NMS0RJVgkJCTAKKyNkZWZpbmUgV004MzUwX0RBQ19DTEtESVYJCQkxCisjZGVmaW5lIFdNODM1MF9CQ0xLX0NMS0RJVgkJCTIKKyNkZWZpbmUgV004MzUwX09QQ0xLX0NMS0RJVgkJCTMKKyNkZWZpbmUgV004MzUwX1RPX0NMS0RJVgkJCTQKKyNkZWZpbmUgV004MzUwX1NZU19DTEtESVYJCQk1CisjZGVmaW5lIFdNODM1MF9EQUNMUl9DTEtESVYJCQk2CisjZGVmaW5lIFdNODM1MF9BRENMUl9DTEtESVYJCQk3CisKKy8qIEFEQyBjbG9jayBkaXZpZGVycyAqLworI2RlZmluZSBXTTgzNTBfQURDRElWXzEJCQkJMHgwCisjZGVmaW5lIFdNODM1MF9BRENESVZfMV81CQkJMHgxCisjZGVmaW5lIFdNODM1MF9BRENESVZfMgkJCQkweDIKKyNkZWZpbmUgV004MzUwX0FEQ0RJVl8zCQkJCTB4MworI2RlZmluZSBXTTgzNTBfQURDRElWXzQJCQkJMHg0CisjZGVmaW5lIFdNODM1MF9BRENESVZfNV81CQkJMHg1CisjZGVmaW5lIFdNODM1MF9BRENESVZfNgkJCQkweDYKKworLyogQURDIGNsb2NrIGRpdmlkZXJzICovCisjZGVmaW5lIFdNODM1MF9EQUNESVZfMQkJCQkweDAKKyNkZWZpbmUgV004MzUwX0RBQ0RJVl8xXzUJCQkweDEKKyNkZWZpbmUgV004MzUwX0RBQ0RJVl8yCQkJCTB4MgorI2RlZmluZSBXTTgzNTBfREFDRElWXzMJCQkJMHgzCisjZGVmaW5lIFdNODM1MF9EQUNESVZfNAkJCQkweDQKKyNkZWZpbmUgV004MzUwX0RBQ0RJVl81XzUJCQkweDUKKyNkZWZpbmUgV004MzUwX0RBQ0RJVl82CQkJCTB4NgorCisvKiBCQ0xLIGNsb2NrIGRpdmlkZXJzICovCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl8xCQkJKDB4MCA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfMV81CQkJKDB4MSA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfMgkJCSgweDIgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzMJCQkoMHgzIDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl80CQkJKDB4NCA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfNV81CQkJKDB4NSA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfNgkJCSgweDYgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzgJCQkoMHg3IDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl8xMQkJCSgweDggPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzEyCQkJKDB4OSA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfMTYJCQkoMHhhIDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl8yMgkJCSgweGIgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzI0CQkJKDB4YyA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfMzIJCQkoMHhkIDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl80NAkJCSgweGUgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzQ4CQkJKDB4ZiA8PCA0KQorCisvKiBTeXMgKE1DTEspIGNsb2NrIGRpdmlkZXJzICovCisjZGVmaW5lIFdNODM1MF9NQ0xLX0RJVl8xCQkJKDB4MCA8PCA4KQorI2RlZmluZSBXTTgzNTBfTUNMS19ESVZfMgkJCSgweDEgPDwgOCkKKworLyogT1AgY2xvY2sgZGl2aWRlcnMgKi8KKyNkZWZpbmUgV004MzUwX09QQ0xLX0RJVl8xCQkJMHgwCisjZGVmaW5lIFdNODM1MF9PUENMS19ESVZfMgkJCTB4MQorI2RlZmluZSBXTTgzNTBfT1BDTEtfRElWXzMJCQkweDIKKyNkZWZpbmUgV004MzUwX09QQ0xLX0RJVl80CQkJMHgzCisjZGVmaW5lIFdNODM1MF9PUENMS19ESVZfNV81CQkJMHg0CisjZGVmaW5lIFdNODM1MF9PUENMS19ESVZfNgkJCTB4NQorCisvKiBEQUkgSUQgKi8KKyNkZWZpbmUgV004MzUwX0hJRklfREFJCQkJCTAKKworLyoKKyAqIEF1ZGlvIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX0wJCTM5CisjZGVmaW5lIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9SCQk0MAorI2RlZmluZSBXTTgzNTBfSVJRX0NPREVDX01JQ1NDRAkJCTQxCisjZGVmaW5lIFdNODM1MF9JUlFfQ09ERUNfTUlDRAkJCTQyCisKK3N0cnVjdCB3bTgzNTBfY29kZWMgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb21wYXJhdG9yLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Mzc4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogY29tcGFyYXRvci5oICAtLSAgQ29tcGFyYXRvciBBdXggQURDIGZvciBXb2xmc29uIFdNODM1MCBQTUlDCisgKgorICogQ29weXJpZ2h0IDIwMDcgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfV004MzUwX0NPTVBBUkFUT1JfSF8KKyNkZWZpbmUgX19MSU5VWF9NRkRfV004MzUwX0NPTVBBUkFUT1JfSF8KKworLyoKKyAqIFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgV004MzUwX0RJR0lUSVNFUl9DT05UUk9MXzEgICAgICAgICAgICAgIDB4OTAKKyNkZWZpbmUgV004MzUwX0RJR0lUSVNFUl9DT05UUk9MXzIgICAgICAgICAgICAgIDB4OTEKKyNkZWZpbmUgV004MzUwX0FVWDFfUkVBREJBQ0sgICAgICAgICAgICAgICAgICAgIDB4OTgKKyNkZWZpbmUgV004MzUwX0FVWDJfUkVBREJBQ0sgICAgICAgICAgICAgICAgICAgIDB4OTkKKyNkZWZpbmUgV004MzUwX0FVWDNfUkVBREJBQ0sgICAgICAgICAgICAgICAgICAgIDB4OUEKKyNkZWZpbmUgV004MzUwX0FVWDRfUkVBREJBQ0sgICAgICAgICAgICAgICAgICAgIDB4OUIKKyNkZWZpbmUgV004MzUwX0NISVBfVEVNUF9SRUFEQkFDSyAgICAgICAgICAgICAgIDB4OUYKKyNkZWZpbmUgV004MzUwX0dFTkVSSUNfQ09NUEFSQVRPUl9DT05UUk9MICAgICAgIDB4QTMKKyNkZWZpbmUgV004MzUwX0dFTkVSSUNfQ09NUEFSQVRPUl8xICAgICAgICAgICAgIDB4QTQKKyNkZWZpbmUgV004MzUwX0dFTkVSSUNfQ09NUEFSQVRPUl8yICAgICAgICAgICAgIDB4QTUKKyNkZWZpbmUgV004MzUwX0dFTkVSSUNfQ09NUEFSQVRPUl8zICAgICAgICAgICAgIDB4QTYKKyNkZWZpbmUgV004MzUwX0dFTkVSSUNfQ09NUEFSQVRPUl80ICAgICAgICAgICAgIDB4QTcKKworLyoKKyAqIFIxNDQgKDB4OTApIC0gRGlnaXRpc2VyIENvbnRyb2wgKDEpCisgKi8KKyNkZWZpbmUgV004MzUwX0FVWEFEQ19DVEMgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1BPTEwgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfSElCX01PREUgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TRUw4ICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1NFTDcgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0VMNiAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TRUw1ICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1NFTDQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0VMMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TRUwyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfQVVYQURDX1NFTDEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTQ1ICgweDkxKSAtIERpZ2l0aXNlciBDb250cm9sICgyKQorICovCisjZGVmaW5lIFdNODM1MF9BVVhBRENfTUFTS01PREVfTUFTSyAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19DUkFURV9NQVNLICAgICAgICAgICAgICAgIDB4MDcwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0NBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9BVVhfUkJNT0RFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19XQUlUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjE1MiAoMHg5OCkgLSBBVVgxIFJlYWRiYWNrCisgKi8KKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TQ0FMRTFfTUFTSyAgICAgICAgICAgICAgIDB4NjAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1JFRjEgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfREFUQTFfTUFTSyAgICAgICAgICAgICAgICAweDBGRkYKKworLyoKKyAqIFIxNTMgKDB4OTkpIC0gQVVYMiBSZWFkYmFjaworICovCisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0NBTEUyX01BU0sgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19SRUYyICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0RBVEEyX01BU0sgICAgICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTU0ICgweDlBKSAtIEFVWDMgUmVhZGJhY2sKKyAqLworI2RlZmluZSBXTTgzNTBfQVVYQURDX1NDQUxFM19NQVNLICAgICAgICAgICAgICAgMHg2MDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfUkVGMyAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQVRBM19NQVNLICAgICAgICAgICAgICAgIDB4MEZGRgorCisvKgorICogUjE1NSAoMHg5QikgLSBBVVg0IFJlYWRiYWNrCisgKi8KKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TQ0FMRTRfTUFTSyAgICAgICAgICAgICAgIDB4NjAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1JFRjQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfREFUQTRfTUFTSyAgICAgICAgICAgICAgICAweDBGRkYKKworLyoKKyAqIFIxNTYgKDB4OUMpIC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sKKyAqLworI2RlZmluZSBXTTgzNTBfQVVYQURDX0RBVEFfVVNCX01BU0sgICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTU3ICgweDlEKSAtIExJTkUgVm9sdGFnZSBSZWFkYmFjaworICovCisjZGVmaW5lIFdNODM1MF9BVVhBRENfREFUQV9MSU5FX01BU0sgICAgICAgICAgICAweDBGRkYKKworLyoKKyAqIFIxNTggKDB4OUUpIC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrCisgKi8KKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQVRBX0JBVFRfTUFTSyAgICAgICAgICAgIDB4MEZGRgorCisvKgorICogUjE1OSAoMHg5RikgLSBDaGlwIFRlbXAgUmVhZGJhY2sKKyAqLworI2RlZmluZSBXTTgzNTBfQVVYQURDX0RBVEFfQ0hJUFRFTVBfTUFTSyAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTYzICgweEEzKSAtIEdlbmVyaWMgQ29tcGFyYXRvciBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RDTVA0X0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfRENNUDNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9EQ01QMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0RDTVAxX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjE2NCAoMHhBNCkgLSBHZW5lcmljIGNvbXBhcmF0b3IgMQorICovCisjZGVmaW5lIFdNODM1MF9EQ01QMV9TUkNTRUxfTUFTSyAgICAgICAgICAgICAgICAweEUwMDAKKyNkZWZpbmUgV004MzUwX0RDTVAxX0dUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfRENNUDFfVEhSX01BU0sgICAgICAgICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTY1ICgweEE1KSAtIEdlbmVyaWMgY29tcGFyYXRvciAyCisgKi8KKyNkZWZpbmUgV004MzUwX0RDTVAyX1NSQ1NFTF9NQVNLICAgICAgICAgICAgICAgIDB4RTAwMAorI2RlZmluZSBXTTgzNTBfRENNUDJfR1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9EQ01QMl9USFJfTUFTSyAgICAgICAgICAgICAgICAgICAweDBGRkYKKworLyoKKyAqIFIxNjYgKDB4QTYpIC0gR2VuZXJpYyBjb21wYXJhdG9yIDMKKyAqLworI2RlZmluZSBXTTgzNTBfRENNUDNfU1JDU0VMX01BU0sgICAgICAgICAgICAgICAgMHhFMDAwCisjZGVmaW5lIFdNODM1MF9EQ01QM19HVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RDTVAzX1RIUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MEZGRgorCisvKgorICogUjE2NyAoMHhBNykgLSBHZW5lcmljIGNvbXBhcmF0b3IgNAorICovCisjZGVmaW5lIFdNODM1MF9EQ01QNF9TUkNTRUxfTUFTSyAgICAgICAgICAgICAgICAweEUwMDAKKyNkZWZpbmUgV004MzUwX0RDTVA0X0dUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfRENNUDRfVEhSX01BU0sgICAgICAgICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBJbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIFdNODM1MF9JUlFfQVVYQURDX0RBVEFSRFkJCTE2CisjZGVmaW5lIFdNODM1MF9JUlFfQVVYQURDX0RDT01QNAkJMTcKKyNkZWZpbmUgV004MzUwX0lSUV9BVVhBRENfRENPTVAzCQkxOAorI2RlZmluZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDIJCTE5CisjZGVmaW5lIFdNODM1MF9JUlFfQVVYQURDX0RDT01QMQkJMjAKKyNkZWZpbmUgV004MzUwX0lSUV9TWVNfSFlTVF9DT01QX0ZBSUwJCTIxCisjZGVmaW5lIFdNODM1MF9JUlFfU1lTX0NISVBfR1QxMTUJCTIyCisjZGVmaW5lIFdNODM1MF9JUlFfU1lTX0NISVBfR1QxNDAJCTIzCisKKy8qCisgKiBVU0IvMiwgTElORSAmIEJBVFQgPSAoKFZSVEMgKiAyKSAvIDQwOTUpKSAqIDEwZTYgdVYKKyAqIFdoZXJlIFZSVEMgPSAyLjcgVgorICovCisjZGVmaW5lIFdNODM1MF9BVVhfQ09FRkYJCQkxMzE5CisKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19BVVgxCQkJMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0FVWDIJCQkxCisjZGVmaW5lIFdNODM1MF9BVVhBRENfQVVYMwkJCTIKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19BVVg0CQkJMworI2RlZmluZSBXTTgzNTBfQVVYQURDX1VTQgkJCTQKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19MSU5FCQkJNQorI2RlZmluZSBXTTgzNTBfQVVYQURDX0JBVFQJCQk2CisjZGVmaW5lIFdNODM1MF9BVVhBRENfVEVNUAkJCTcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJmOTdmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvcmUuaApAQCAtMCwwICsxLDYzMSBAQAorLyoKKyAqIGNvcmUuaCAgLS0gIENvcmUgRHJpdmVyIGZvciBXb2xmc29uIFdNODM1MCBQTUlDCisgKgorICogQ29weXJpZ2h0IDIwMDcgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODM1MF9DT1JFX0hfCisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODM1MF9DT1JFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9hdWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcG1pYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3dkdC5oPgorCisvKgorICogUmVnaXN0ZXIgdmFsdWVzLgorICovCisjZGVmaW5lIFdNODM1MF9SRVNFVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFdNODM1MF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFdNODM1MF9TWVNURU1fQ09OVFJPTF8xICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFdNODM1MF9TWVNURU1fQ09OVFJPTF8yICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFdNODM1MF9TWVNURU1fSElCRVJOQVRFICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFdNODM1MF9JTlRFUkZBQ0VfQ09OVFJPTCAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFdNODM1MF9QT1dFUl9NR01UXzEgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFdNODM1MF9QT1dFUl9NR01UXzIgICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIFdNODM1MF9QT1dFUl9NR01UXzMgICAgICAgICAgICAgICAgICAgICAweDBBCisjZGVmaW5lIFdNODM1MF9QT1dFUl9NR01UXzQgICAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIFdNODM1MF9QT1dFUl9NR01UXzUgICAgICAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIFdNODM1MF9QT1dFUl9NR01UXzYgICAgICAgICAgICAgICAgICAgICAweDBECisjZGVmaW5lIFdNODM1MF9QT1dFUl9NR01UXzcgICAgICAgICAgICAgICAgICAgICAweDBFCisKKyNkZWZpbmUgV004MzUwX1NZU1RFTV9JTlRFUlJVUFRTICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgV004MzUwX0lOVF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgV004MzUwX0lOVF9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgIDB4MUEKKyNkZWZpbmUgV004MzUwX1BPV0VSX1VQX0lOVF9TVEFUVVMgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVUyAgICAgICAgIDB4MUMKKyNkZWZpbmUgV004MzUwX09WRVJfQ1VSUkVOVF9JTlRfU1RBVFVTICAgICAgICAgIDB4MUQKKyNkZWZpbmUgV004MzUwX0dQSU9fSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4MUUKKyNkZWZpbmUgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVUyAgICAgICAgICAgIDB4MUYKKyNkZWZpbmUgV004MzUwX1NZU1RFTV9JTlRFUlJVUFRTX01BU0sgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLICAgICAgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLICAgICAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgV004MzUwX1BPV0VSX1VQX0lOVF9TVEFUVVNfTUFTSyAgICAgICAgIDB4MjMKKyNkZWZpbmUgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLICAgIDB4MjQKKyNkZWZpbmUgV004MzUwX09WRVJfQ1VSUkVOVF9JTlRfU1RBVFVTX01BU0sgICAgIDB4MjUKKyNkZWZpbmUgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLICAgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLICAgICAgIDB4MjcKKworI2RlZmluZSBXTTgzNTBfTUFYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHhGRgorCisvKgorICogRmllbGQgRGVmaW5pdGlvbnMuCisgKi8KKworLyoKKyAqIFIwICgweDAwKSAtIFJlc2V0L0lECisgKi8KKyNkZWZpbmUgV004MzUwX1NXX1JFU0VUX0NISVBfSURfTUFTSyAgICAgICAgICAgIDB4RkZGRgorCisvKgorICogUjEgKDB4MDEpIC0gSUQKKyAqLworI2RlZmluZSBXTTgzNTBfQ0hJUF9SRVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIFdNODM1MF9DT05GX1NUU19NQVNLICAgICAgICAgICAgICAgICAgICAweDBDMDAKKyNkZWZpbmUgV004MzUwX0NVU1RfSURfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDBGRgorCisvKgorICogUjMgKDB4MDMpIC0gU3lzdGVtIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODM1MF9DSElQX09OICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX1BPV0VSQ1lDTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfVkNDX0ZBVUxUX09WICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9SRUdfUlNUQl9USU1FX01BU0sgICAgICAgICAgICAgICAweDBDMDAKKyNkZWZpbmUgV004MzUwX0JHX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfTUVNX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9DSElQX1NFVF9VUCAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX09OX0RFQl9UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfT05fUE9MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JUlFfUE9MICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFI0ICgweDA0KSAtIFN5c3RlbSBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTgzNTBfVVNCX1NVU1BFTkRfOE1BICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9VU0JfU1VTUEVORCAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX1VTQl9NU1RSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfVVNCX01TVFJfU1JDICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9VU0JfNTAwTUEgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX1VTQl9OT0xJTSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorCisvKgorICogUjUgKDB4MDUpIC0gU3lzdGVtIEhpYmVybmF0ZQorICovCisjZGVmaW5lIFdNODM1MF9ISUJFUk5BVEUgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX1dET0dfSElCX01PREUgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfUkVHX0hJQl9TVEFSVFVQX1NFUSAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9SRUdfUkVTRVRfSElCX01PREUgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX1JTVF9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfSVJRX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9NRU1SU1RfSElCX01PREUgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX1BDQ09NUF9ISUJfTU9ERSAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfVEVNUE1PTl9ISUJfTU9ERSAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSNiAoMHgwNikgLSBJbnRlcmZhY2UgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9VU0VfREVWX1BJTlMgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX1VTRV9ERVZfUElOU19NQVNLICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfVVNFX0RFVl9QSU5TX1NISUZUICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFdNODM1MF9ERVZfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgV004MzUwX0RFVl9BRERSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBXTTgzNTBfQ09ORklHX0RPTkUgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9DT05GSUdfRE9ORV9NQVNLICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0NPTkZJR19ET05FX1NISUZUICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBXTTgzNTBfUkVDT05GSUdfQVRfT04gICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9SRUNPTkZJR19BVF9PTl9NQVNLICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX1JFQ09ORklHX0FUX09OX1NISUZUICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBXTTgzNTBfQVVUT0lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9BVVRPSU5DX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0FVVE9JTkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXTTgzNTBfQVJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9BUkFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0FSQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfU1BJX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9TUElfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX1NQSV9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfU1BJXzRXSVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9TUElfNFdJUkVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX1NQSV80V0lSRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfU1BJXzNXSVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9TUElfM1dJUkVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX1NQSV8zV0lSRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBCaXQgdmFsdWVzIGZvciBSMDYgKDB4MDYpICovCisjZGVmaW5lIFdNODM1MF9VU0VfREVWX1BJTlNfUFJJTUFSWSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1VTRV9ERVZfUElOU19ERVYgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9ERVZfQUREUl8zNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RFVl9BRERSXzM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREVWX0FERFJfM0MgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9ERVZfQUREUl8zRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBXTTgzNTBfQ09ORklHX0RPTkVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9DT05GSUdfRE9ORV9ET05FICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUkVDT05GSUdfQVRfT05fT0ZGICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SRUNPTkZJR19BVF9PTl9PTiAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfQVVUT0lOQ19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9BVVRPSU5DX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfQVJBX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9BUkFfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfU1BJX0NGR19DTU9TICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9TUElfQ0ZHX09EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfU1BJXzRXSVJFXzNXSVJFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9TUElfNFdJUkVfNFdJUkUgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfU1BJXzNXSVJFX0kyQyAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9TUElfM1dJUkVfU1BJICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyoKKyAqIFI4ICgweDA4KSAtIFBvd2VyIG1nbXQgKDEpCisgKi8KKyNkZWZpbmUgV004MzUwX0NPREVDX0lTRUxfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfVkJVRkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9PVVRQVVRfRFJBSU5fRU4gICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX01JQ19ERVRfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQklBU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9NSUNCRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX1ZNSURFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfVk1JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFdNODM1MF9WTUlEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqIFI5ICgweDA5KSAtIFBvd2VyIG1nbXQgKDIpCisgKi8KKyNkZWZpbmUgV004MzUwX0lOM1JfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfSU4zTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTlJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0lOTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfTUlYSU5SX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9NSVhJTkxfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX09VVDRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfT1VUM19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9NSVhPVVRSX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX01JWE9VVExfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjEwICgweDBBKSAtIFBvd2VyIG1nbXQgKDMpCisgKi8KKyNkZWZpbmUgV004MzUwX0lOM1JfVE9fT1VUMlIgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfT1VUMlJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9PVVQyTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX09VVDFSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfT1VUMUxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTEgKDB4MEIpIC0gUG93ZXIgbWdtdCAoNCkKKyAqLworI2RlZmluZSBXTTgzNTBfU1lTQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9BRENfSFBGX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0ZMTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfRkxMX09TQ19FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9UT0NMS19FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0RBQ1JfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfREFDTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9BRENSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0FEQ0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorCisvKgorICogUjEyICgweDBDKSAtIFBvd2VyIG1nbXQgKDUpCisgKi8KKyNkZWZpbmUgV004MzUwX0NPREVDX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfUlRDX1RJQ0tfRU5BICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9PU0MzMktfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0NIR19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfQUNDX0RFVF9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0RDTVA0X0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfRENNUDNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9EQ01QMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0RDTVAxX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjEzICgweDBEKSAtIFBvd2VyIG1nbXQgKDYpCisgKi8KKyNkZWZpbmUgV004MzUwX0xTX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfTERPNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9MRE8zX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0xETzJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfTERPMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9EQzZfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0RDNV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfREM0X0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9EQzNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0RDMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfREMxX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTQgKDB4MEUpIC0gUG93ZXIgbWdtdCAoNykKKyAqLworI2RlZmluZSBXTTgzNTBfQ1MyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9DUzFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIyNCAoMHgxOCkgLSBTeXN0ZW0gSW50ZXJydXB0cworICovCisjZGVmaW5lIFdNODM1MF9PQ19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX1VWX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfUFVUT19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9DU19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0VYVF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQ09ERUNfSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9HUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfUlRDX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9TWVNfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0NIR19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfVVNCX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9XS1VQX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIyNSAoMHgxOSkgLSBJbnRlcnJ1cHQgU3RhdHVzIDEKKyAqLworI2RlZmluZSBXTTgzNTBfQ0hHX0JBVF9IT1RfRUlOVCAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9DSEdfQkFUX0NPTERfRUlOVCAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0NIR19CQVRfRkFJTF9FSU5UICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX1RPX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9DSEdfRU5EX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0NIR19TVEFSVF9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfQ0hHX0ZBU1RfUkRZX0VJTlQgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9SVENfUEVSX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX1JUQ19TRUNfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTV9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9DSEdfVkJBVFRfTFRfM1A5X0VJTlQgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0NIR19WQkFUVF9MVF8zUDFfRUlOVCAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfQ0hHX1ZCQVRUX0xUXzJQODVfRUlOVCAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMjYgKDB4MUEpIC0gSW50ZXJydXB0IFN0YXR1cyAyCisgKi8KKyNkZWZpbmUgV004MzUwX0NTMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQ1MyX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9VU0JfTElNSVRfRUlOVCAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQVRBUkRZX0VJTlQgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0RDT01QNF9FSU5UICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfRENPTVAzX0VJTlQgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQ09NUDJfRUlOVCAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0RDT01QMV9FSU5UICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9TWVNfSFlTVF9DT01QX0ZBSUxfRUlOVCAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX1NZU19DSElQX0dUMTE1X0VJTlQgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfU1lTX0NISVBfR1QxNDBfRUlOVCAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9TWVNfV0RPR19UT19FSU5UICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIyNyAoMHgxQikgLSBQb3dlciBVcCBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX1BVVE9fTERPNF9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfUFVUT19MRE8zX0VJTlQgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9QVVRPX0xETzJfRUlOVCAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX1BVVE9fTERPMV9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfUFVUT19EQzZfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9QVVRPX0RDNV9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX1BVVE9fREM0X0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfUFVUT19EQzNfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9QVVRPX0RDMl9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX1BVVE9fREMxX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjI4ICgweDFDKSAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cworICovCisjZGVmaW5lIFdNODM1MF9VVl9MRE80X0VJTlQgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX1VWX0xETzNfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfVVZfTERPMl9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9VVl9MRE8xX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX1VWX0RDNl9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfVVZfREM1X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9VVl9EQzRfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX1VWX0RDM19FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfVVZfREMyX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9VVl9EQzFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIyOSAoMHgxRCkgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cworICovCisjZGVmaW5lIFdNODM1MF9PQ19MU19FSU5UICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKworLyoKKyAqIFIzMCAoMHgxRSkgLSBHUElPIEludGVycnVwdCBTdGF0dXMKKyAqLworI2RlZmluZSBXTTgzNTBfR1AxMl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9HUDExX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0dQMTBfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfR1A5X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9HUDhfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0dQN19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfR1A2X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9HUDVfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0dQNF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfR1AzX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9HUDJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0dQMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfR1AwX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMzEgKDB4MUYpIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX0VYVF9VU0JfRkJfRUlOVCAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfRVhUX1dBTExfRkJfRUlOVCAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9FWFRfQkFUX0ZCX0VJTlQgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0NPREVDX0pDS19ERVRfTF9FSU5UICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfQ09ERUNfSkNLX0RFVF9SX0VJTlQgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9DT0RFQ19NSUNTQ0RfRUlOVCAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0NPREVDX01JQ0RfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfV0tVUF9PRkZfU1RBVEVfRUlOVCAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9XS1VQX0hJQl9TVEFURV9FSU5UICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX1dLVVBfQ09OVl9GQVVMVF9FSU5UICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfV0tVUF9XRE9HX1JTVF9FSU5UICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9XS1VQX0dQX1BXUl9PTl9FSU5UICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX1dLVVBfT05LRVlfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfV0tVUF9HUF9XQUtFVVBfRUlOVCAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMzIgKDB4MjApIC0gU3lzdGVtIEludGVycnVwdHMgTWFzaworICovCisjZGVmaW5lIFdNODM1MF9JTV9PQ19JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0lNX1VWX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfSU1fUFVUT19JTlQgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9JTV9TUEFSRV9JTlQgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0lNX0NTX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfSU1fRVhUX0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9JTV9DT0RFQ19JTlQgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0lNX0dQX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfSU1fQVVYQURDX0lOVCAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9JTV9SVENfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0lNX1NZU19JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfSU1fQ0hHX0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTV9VU0JfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lNX1dLVVBfSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjMzICgweDIxKSAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrCisgKi8KKyNkZWZpbmUgV004MzUwX0lNX0NIR19CQVRfSE9UX0VJTlQgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfSU1fQ0hHX0JBVF9DT0xEX0VJTlQgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9JTV9DSEdfQkFUX0ZBSUxfRUlOVCAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0lNX0NIR19UT19FSU5UICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfSU1fQ0hHX0VORF9FSU5UICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9JTV9DSEdfU1RBUlRfRUlOVCAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0lNX0NIR19GQVNUX1JEWV9FSU5UICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfSU1fUlRDX1BFUl9FSU5UICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9JTV9SVENfU0VDX0VJTlQgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0lNX1JUQ19BTE1fRUlOVCAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfSU1fQ0hHX1ZCQVRUX0xUXzNQOV9FSU5UICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTV9DSEdfVkJBVFRfTFRfM1AxX0VJTlQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lNX0NIR19WQkFUVF9MVF8yUDg1X0VJTlQgICAgICAgIDB4MDAwMQorCisvKgorICogUjM0ICgweDIyKSAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrCisgKi8KKyNkZWZpbmUgV004MzUwX0lNX1NQQVJFMl9FSU5UICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfSU1fU1BBUkUxX0VJTlQgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9JTV9DUzFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0lNX0NTMl9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfSU1fVVNCX0xJTUlUX0VJTlQgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTV9BVVhBRENfREFUQVJEWV9FSU5UICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0lNX0FVWEFEQ19EQ09NUDRfRUlOVCAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfSU1fQVVYQURDX0RDT01QM19FSU5UICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9JTV9BVVhBRENfRENPTVAyX0VJTlQgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0lNX0FVWEFEQ19EQ09NUDFfRUlOVCAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfSU1fU1lTX0hZU1RfQ09NUF9GQUlMX0VJTlQgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9JTV9TWVNfQ0hJUF9HVDExNV9FSU5UICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0lNX1NZU19DSElQX0dUMTQwX0VJTlQgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfSU1fU1lTX1dET0dfVE9fRUlOVCAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMzUgKDB4MjMpIC0gUG93ZXIgVXAgSW50ZXJydXB0IFN0YXR1cyBNYXNrCisgKi8KKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fTERPNF9FSU5UICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfSU1fUFVUT19MRE8zX0VJTlQgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTV9QVVRPX0xETzJfRUlOVCAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fTERPMV9FSU5UICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfSU1fUFVUT19EQzZfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9JTV9QVVRPX0RDNV9FSU5UICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fREM0X0VJTlQgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfSU1fUFVUT19EQzNfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTV9QVVRPX0RDMl9FSU5UICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fREMxX0VJTlQgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjM2ICgweDI0KSAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrCisgKi8KKyNkZWZpbmUgV004MzUwX0lNX1VWX0xETzRfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfSU1fVVZfTERPM19FSU5UICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTV9VVl9MRE8yX0VJTlQgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0lNX1VWX0xETzFfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfSU1fVVZfREM2X0VJTlQgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9JTV9VVl9EQzVfRUlOVCAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0lNX1VWX0RDNF9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfSU1fVVZfREMzX0VJTlQgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTV9VVl9EQzJfRUlOVCAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lNX1VWX0RDMV9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjM3ICgweDI1KSAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sKKyAqLworI2RlZmluZSBXTTgzNTBfSU1fT0NfTFNfRUlOVCAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKy8qCisgKiBSMzggKDB4MjYpIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sKKyAqLworI2RlZmluZSBXTTgzNTBfSU1fR1AxMl9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9JTV9HUDExX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0lNX0dQMTBfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfSU1fR1A5X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9JTV9HUDhfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0lNX0dQN19FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfSU1fR1A2X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9JTV9HUDVfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0lNX0dQNF9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfSU1fR1AzX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9JTV9HUDJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0lNX0dQMV9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfSU1fR1AwX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMzkgKDB4MjcpIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sKKyAqLworI2RlZmluZSBXTTgzNTBfSU1fRVhUX1VTQl9GQl9FSU5UICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9JTV9FWFRfV0FMTF9GQl9FSU5UICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0lNX0VYVF9CQVRfRkJfRUlOVCAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfSU1fQ09ERUNfSkNLX0RFVF9MX0VJTlQgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9JTV9DT0RFQ19KQ0tfREVUX1JfRUlOVCAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0lNX0NPREVDX01JQ1NDRF9FSU5UICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfSU1fQ09ERUNfTUlDRF9FSU5UICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9JTV9XS1VQX09GRl9TVEFURV9FSU5UICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0lNX1dLVVBfSElCX1NUQVRFX0VJTlQgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfSU1fV0tVUF9DT05WX0ZBVUxUX0VJTlQgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9JTV9XS1VQX1dET0dfUlNUX0VJTlQgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0lNX1dLVVBfR1BfUFdSX09OX0VJTlQgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfSU1fV0tVUF9PTktFWV9FSU5UICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JTV9XS1VQX0dQX1dBS0VVUF9FSU5UICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIyMjAgKDB4REMpIC0gUkFNIEJJU1QgMQorICovCisjZGVmaW5lIFdNODM1MF9SRUFEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX1RTVFJBTV9DTEsgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfVFNUUkFNX0NMS19FTkEgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9TVEFSVFNFUSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX1JFQURfU1JDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQ09VTlRfRElSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9UU1RSQU1fTU9ERV9NQVNLICAgICAgICAgICAgICAgICAweDAwMEUKKyNkZWZpbmUgV004MzUwX1RTVFJBTV9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjIyNSAoMHhFMSkgLSBEQ0RDL0xETyBzdGF0dXMKKyAqLworI2RlZmluZSBXTTgzNTBfTFNfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9MRE80X1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0xETzNfU1RTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfTERPMl9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9MRE8xX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0RDNl9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfREM1X1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9EQzRfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0RDM19TVFMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfREMyX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9EQzFfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyogV004MzUwIHdha2UgdXAgY29uZGl0aW9ucyAqLworI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfT0ZGX1NUQVRFCQk0MworI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfSElCX1NUQVRFCQk0NAorI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfQ09OVl9GQVVMVAkJNDUKKyNkZWZpbmUgV004MzUwX0lSUV9XS1VQX1dET0dfUlNUCQk0NgorI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfR1BfUFdSX09OCQk0NworI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfT05LRVkJCQk0OAorI2RlZmluZSBXTTgzNTBfSVJRX1dLVVBfR1BfV0FLRVVQCQk0OQorCisvKiB3bTgzNTAgY2hpcCByZXZpc2lvbnMgKi8KKyNkZWZpbmUgV004MzUwX1JFVl9FCQkJCTB4NAorI2RlZmluZSBXTTgzNTBfUkVWX0YJCQkJMHg1CisjZGVmaW5lIFdNODM1MF9SRVZfRwkJCQkweDYKKworI2RlZmluZSBXTTgzNTBfTlVNX0lSUQkJCQk2MworCitzdHJ1Y3Qgd204MzUwX3JlZ19hY2Nlc3MgeworCXUxNiByZWFkYWJsZTsJCS8qIE1hc2sgb2YgcmVhZGFibGUgYml0cyAqLworCXUxNiB3cml0YWJsZTsJCS8qIE1hc2sgb2Ygd3JpdGFibGUgYml0cyAqLworCXUxNiB2b2w7CQkvKiBNYXNrIG9mIHZvbGF0aWxlIGJpdHMgKi8KK307CitleHRlcm4gY29uc3Qgc3RydWN0IHdtODM1MF9yZWdfYWNjZXNzIHdtODM1MF9yZWdfaW9fbWFwW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1MF9tb2RlMF9kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTBfbW9kZTFfZGVmYXVsdHNbXTsKK2V4dGVybiBjb25zdCB1MTYgd204MzUwX21vZGUyX2RlZmF1bHRzW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1MF9tb2RlM19kZWZhdWx0c1tdOworCitzdHJ1Y3Qgd204MzUwOworCitzdHJ1Y3Qgd204MzUwX2lycSB7CisJdm9pZCAoKmhhbmRsZXIpIChzdHJ1Y3Qgd204MzUwICosIGludCwgdm9pZCAqKTsKKwl2b2lkICpkYXRhOworfTsKKworc3RydWN0IHdtODM1MCB7CisJaW50IHJldjsJCS8qIGNoaXAgcmV2aXNpb24gKi8KKworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCS8qIGRldmljZSBJTyAqLworCXVuaW9uIHsKKwkJc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQ7CisJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2aWNlOworCX07CisJaW50ICgqcmVhZF9kZXYpKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgY2hhciByZWcsIGludCBzaXplLCB2b2lkICpkZXN0KTsKKwlpbnQgKCp3cml0ZV9kZXYpKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgY2hhciByZWcsIGludCBzaXplLAorCQkJIHZvaWQgKnNyYyk7CisJdTE2ICpyZWdfY2FjaGU7CisKKwkvKiBJbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXJxX3dvcms7CisJc3RydWN0IG11dGV4IGlycV9tdXRleDsgLyogSVJRIHRhYmxlIG11dGV4ICovCisJc3RydWN0IHdtODM1MF9pcnEgaXJxW1dNODM1MF9OVU1fSVJRXTsKKwlpbnQgY2hpcF9pcnE7CisKKwkvKiBDbGllbnQgZGV2aWNlcyAqLworCXN0cnVjdCB3bTgzNTBfY29kZWMgY29kZWM7CisJc3RydWN0IHdtODM1MF9ncGlvIGdwaW87CisJc3RydWN0IHdtODM1MF9wbWljIHBtaWM7CisJc3RydWN0IHdtODM1MF9wb3dlciBwb3dlcjsKKwlzdHJ1Y3Qgd204MzUwX3J0YyBydGM7CisJc3RydWN0IHdtODM1MF93ZHQgd2R0OworfTsKKworLyoqCisgKiBEYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IHRoZSBwbGF0Zm9ybSB0byBpbml0aWFsaXNlIHRoZSBXTTgzNTAuCisgKgorICogQGluaXQ6IEZ1bmN0aW9uIGNhbGxlZCBkdXJpbmcgZHJpdmVyIGluaXRpYWxpc2F0aW9uLiAgU2hvdWxkIGJlCisgKiAgICAgICAgdXNlZCBieSB0aGUgcGxhdGZvcm0gdG8gY29uZmlndXJlIEdQSU8gZnVuY3Rpb25zIGFuZCBzaW1pbGFyLgorICovCitzdHJ1Y3Qgd204MzUwX3BsYXRmb3JtX2RhdGEgeworCWludCAoKmluaXQpKHN0cnVjdCB3bTgzNTAgKndtODM1MCk7Cit9OworCisKKy8qCisgKiBXTTgzNTAgZGV2aWNlIGluaXRpYWxpc2F0aW9uIGFuZCBleGl0LgorICovCitpbnQgd204MzUwX2RldmljZV9pbml0KHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSwKKwkJICAgICAgIHN0cnVjdCB3bTgzNTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOwordm9pZCB3bTgzNTBfZGV2aWNlX2V4aXQoc3RydWN0IHdtODM1MCAqd204MzUwKTsKKworLyoKKyAqIFdNODM1MCBkZXZpY2UgSU8KKyAqLworaW50IHdtODM1MF9jbGVhcl9iaXRzKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgdTE2IHJlZywgdTE2IG1hc2spOworaW50IHdtODM1MF9zZXRfYml0cyhzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIHUxNiByZWcsIHUxNiBtYXNrKTsKK3UxNiB3bTgzNTBfcmVnX3JlYWQoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgcmVnKTsKK2ludCB3bTgzNTBfcmVnX3dyaXRlKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IHJlZywgdTE2IHZhbCk7CitpbnQgd204MzUwX3JlZ19sb2NrKHN0cnVjdCB3bTgzNTAgKndtODM1MCk7CitpbnQgd204MzUwX3JlZ191bmxvY2soc3RydWN0IHdtODM1MCAqd204MzUwKTsKK2ludCB3bTgzNTBfYmxvY2tfcmVhZChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCByZWcsIGludCBzaXplLCB1MTYgKmRlc3QpOworaW50IHdtODM1MF9ibG9ja193cml0ZShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCByZWcsIGludCBzaXplLCB1MTYgKnNyYyk7CisKKy8qCisgKiBXTTgzNTAgaW50ZXJuYWwgaW50ZXJydXB0cworICovCitpbnQgd204MzUwX3JlZ2lzdGVyX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCisJCQl2b2lkICgqaGFuZGxlcikgKHN0cnVjdCB3bTgzNTAgKiwgaW50LCB2b2lkICopLAorCQkJdm9pZCAqZGF0YSk7CitpbnQgd204MzUwX2ZyZWVfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSk7CitpbnQgd204MzUwX21hc2tfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSk7CitpbnQgd204MzUwX3VubWFza19pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9ncGlvLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTFlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvZ3Bpby5oCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogZ3Bpby5oICAtLSAgR1BJTyBEcml2ZXIgZm9yIFdvbGZzb24gV004MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfV004MzUwX0dQSU9fSF8KKyNkZWZpbmUgX19MSU5VWF9NRkRfV004MzUwX0dQSU9fSF8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisvKgorICogR1BJTyBSZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgV004MzUwX0dQSU9fREVCT1VOQ0UgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgV004MzUwX0dQSU9fUElOX1BVTExfVVBfQ09OVFJPTCAgICAgICAgIDB4ODEKKyNkZWZpbmUgV004MzUwX0dQSU9fUFVMTF9ET1dOX0NPTlRST0wgICAgICAgICAgIDB4ODIKKyNkZWZpbmUgV004MzUwX0dQSU9fSU5UX01PREUgICAgICAgICAgICAgICAgICAgIDB4ODMKKyNkZWZpbmUgV004MzUwX0dQSU9fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4ODUKKyNkZWZpbmUgV004MzUwX0dQSU9fQ09ORklHVVJBVElPTl9JX08gICAgICAgICAgIDB4ODYKKyNkZWZpbmUgV004MzUwX0dQSU9fUElOX1BPTEFSSVRZX1RZUEUgICAgICAgICAgIDB4ODcKKyNkZWZpbmUgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzEgICAgICAgICAgIDB4OEMKKyNkZWZpbmUgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzIgICAgICAgICAgIDB4OEQKKyNkZWZpbmUgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzMgICAgICAgICAgIDB4OEUKKyNkZWZpbmUgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzQgICAgICAgICAgIDB4OEYKKworLyoKKyAqIEdQSU8gRnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgV004MzUwX0dQSU8wX0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8wX0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMF9QV1JfT05fSU4JCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8wX1BXUl9PTl9PVVQJCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8wX0xET19FTl9JTgkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzBfVlJUQ19PVVQJCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8wX0xQV1IxX0lOCQkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPMF9QT1JfQl9PVVQJCQkweDMKKworI2RlZmluZSBXTTgzNTBfR1BJTzFfR1BJT19JTgkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzFfR1BJT19PVVQJCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8xX1BXUl9PTl9JTgkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzFfRE9fQ09ORl9PVVQJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzFfTERPX0VOX0lOCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMV9SRVNFVF9PVVQJCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8xX0xQV1IyX0lOCQkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPMV9NRU1SU1RfT1VUCQkJMHgzCisKKyNkZWZpbmUgV004MzUwX0dQSU8yX0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8yX0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMl9QV1JfT05fSU4JCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8yX1BXUl9PTl9PVVQJCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8yX1dBS0VfVVBfSU4JCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8yX1ZSVENfT1VUCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMl8zMktIWl9JTgkJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzJfMzJLSFpfT1VUCQkJMHgzCisKKyNkZWZpbmUgV004MzUwX0dQSU8zX0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8zX0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPM19QV1JfT05fSU4JCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8zX1BfQ0xLX09VVAkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzNfTERPX0VOX0lOCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPM19WUlRDX09VVAkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzNfUFdSX09GRl9JTgkJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzNfMzJLSFpfT1VUCQkJMHgzCisKKyNkZWZpbmUgV004MzUwX0dQSU80X0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU80X0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPNF9NUl9JTgkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzRfTUVNX1JTVF9PVVQJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzRfRkxBU0hfSU4JCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU80X0FEQV9PVVQJCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU80X0hJQkVSTkFURV9JTgkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPNF9GTEFTSF9PVVQJCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU80X01JQ0RFVF9PVVQJCQkweDQKKyNkZWZpbmUgV004MzUwX0dQSU80X01JQ1NIVF9PVVQJCQkweDUKKworI2RlZmluZSBXTTgzNTBfR1BJTzVfR1BJT19JTgkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzVfR1BJT19PVVQJCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU81X0xQV1IxX0lOCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPNV9QX0NMS19PVVQJCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU81X0FEQ0xSQ0xLX0lOCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU81X0FEQ0xSQ0xLX09VVAkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPNV9ISUJFUk5BVEVfSU4JCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzVfMzJLSFpfT1VUCQkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPNV9NSUNERVRfT1VUCQkJMHg0CisjZGVmaW5lIFdNODM1MF9HUElPNV9NSUNTSFRfT1VUCQkJMHg1CisjZGVmaW5lIFdNODM1MF9HUElPNV9BREFfT1VUCQkJMHg2CisjZGVmaW5lIFdNODM1MF9HUElPNV9PUENMS19PVVQJCQkweDcKKworI2RlZmluZSBXTTgzNTBfR1BJTzZfR1BJT19JTgkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzZfR1BJT19PVVQJCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU82X0xQV1IyX0lOCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPNl9NRU1SU1RfT1VUCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPNl9GTEFTSF9JTgkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzZfQURBX09VVAkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzZfSElCRVJOQVRFX0lOCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU82X1JUQ19PVVQJCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU82X01JQ0RFVF9PVVQJCQkweDQKKyNkZWZpbmUgV004MzUwX0dQSU82X01JQ1NIVF9PVVQJCQkweDUKKyNkZWZpbmUgV004MzUwX0dQSU82X0FEQ0xSQ0xLQl9PVVQJCTB4NgorI2RlZmluZSBXTTgzNTBfR1BJTzZfU0RPVVRfT1VUCQkJMHg3CisKKyNkZWZpbmUgV004MzUwX0dQSU83X0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU83X0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPN19MUFdSM19JTgkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzdfUF9DTEtfT1VUCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPN19NQVNLX0lOCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPN19WQ0NfRkFVTFRfT1VUCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU83X0hJQkVSTkFURV9JTgkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPN19CQVRUX0ZBVUxUX09VVAkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPN19NSUNERVRfT1VUCQkJMHg0CisjZGVmaW5lIFdNODM1MF9HUElPN19NSUNTSFRfT1VUCQkJMHg1CisjZGVmaW5lIFdNODM1MF9HUElPN19BREFfT1VUCQkJMHg2CisjZGVmaW5lIFdNODM1MF9HUElPN19DU0JfSU4JCQkweDcKKworI2RlZmluZSBXTTgzNTBfR1BJTzhfR1BJT19JTgkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzhfR1BJT19PVVQJCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU84X01SX0lOCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPOF9WQ0NfRkFVTFRfT1VUCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU84X0FEQ0JDTEtfSU4JCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU84X0FEQ0JDTEtfT1VUCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU84X1BXUl9PRkZfSU4JCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU84X0JBVFRfRkFVTFRfT1VUCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU84X0FMVFNDTF9JTgkJCTB4ZgorCisjZGVmaW5lIFdNODM1MF9HUElPOV9HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPOV9HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzlfSEVBUlRCRUFUX0lOCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU85X1ZDQ19GQVVMVF9PVVQJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzlfTUFTS19JTgkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzlfTElORV9HVF9CQVRUX09VVAkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPOV9QV1JfT0ZGX0lOCQkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPOV9CQVRUX0ZBVUxUX09VVAkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPOV9BTFRTREFfT1VUCQkJMHhmCisKKyNkZWZpbmUgV004MzUwX0dQSU8xMF9HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMTBfR1BJT19PVVQJCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8xMF9JU0lOS0NfT1VUCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8xMF9QV1JfT0ZGX0lOCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8xMF9MSU5FX0dUX0JBVFRfT1VUCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8xMF9DSERfSU5EX0lOCQkweDMKKworI2RlZmluZSBXTTgzNTBfR1BJTzExX0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8xMV9HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzExX0lTSU5LRF9PVVQJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzExX1dBS0VVUF9JTgkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzExX0xJTkVfR1RfQkFUVF9PVVQJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzExX0NIRF9JTkRfSU4JCTB4MworCisjZGVmaW5lIFdNODM1MF9HUElPMTJfR1BJT19JTgkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzEyX0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMTJfSVNJTktFX09VVAkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPMTJfTElORV9HVF9CQVRUX09VVAkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMTJfTElORV9FTl9PVVQJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzEyXzMyS0haX09VVAkJCTB4NAorCisjZGVmaW5lIFdNODM1MF9HUElPX0RJUl9JTgkJCTAKKyNkZWZpbmUgV004MzUwX0dQSU9fRElSX09VVAkJCTEKKyNkZWZpbmUgV004MzUwX0dQSU9fQUNUSVZFX0xPVwkJCTAKKyNkZWZpbmUgV004MzUwX0dQSU9fQUNUSVZFX0hJR0gJCQkxCisjZGVmaW5lIFdNODM1MF9HUElPX1BVTExfTk9ORQkJCTAKKyNkZWZpbmUgV004MzUwX0dQSU9fUFVMTF9VUAkJCTEKKyNkZWZpbmUgV004MzUwX0dQSU9fUFVMTF9ET1dOCQkJMgorI2RlZmluZSBXTTgzNTBfR1BJT19JTlZFUlRfT0ZGCQkJMAorI2RlZmluZSBXTTgzNTBfR1BJT19JTlZFUlRfT04JCQkxCisjZGVmaW5lIFdNODM1MF9HUElPX0RFQk9VTkNFX09GRgkJMAorI2RlZmluZSBXTTgzNTBfR1BJT19ERUJPVU5DRV9PTgkJCTEKKworLyoKKyAqIFIxMjggKDB4ODApIC0gR1BJTyBEZWJvdW5jZQorICovCisjZGVmaW5lIFdNODM1MF9HUDEyX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0dQMTFfREIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfR1AxMF9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9HUDlfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0dQOF9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfR1A3X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9HUDZfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0dQNV9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfR1A0X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9HUDNfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0dQMl9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfR1AxX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9HUDBfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMjkgKDB4ODEpIC0gR1BJTyBQaW4gcHVsbCB1cCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfUFUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfR1AxMV9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9HUDEwX1BVICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0dQOV9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfR1A4X1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9HUDdfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0dQNl9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfR1A1X1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9HUDRfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0dQM19QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfR1AyX1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9HUDFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0dQMF9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjEzMCAoMHg4MikgLSBHUElPIFB1bGwgZG93biBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfUEQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfR1AxMV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9HUDEwX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0dQOV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfR1A4X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9HUDdfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0dQNl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfR1A1X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9HUDRfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0dQM19QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfR1AyX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9HUDFfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0dQMF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjEzMSAoMHg4MykgLSBHUElPIEludGVycnVwdCBNb2RlCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfR1AxMV9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9HUDEwX0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0dQOV9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfR1A4X0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9HUDdfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0dQNl9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfR1A1X0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9HUDRfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0dQM19JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfR1AyX0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9HUDFfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0dQMF9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjEzMyAoMHg4NSkgLSBHUElPIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfR1BfREJUSU1FX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEMwCisKKy8qCisgKiBSMTM0ICgweDg2KSAtIEdQSU8gQ29uZmlndXJhdGlvbiAoaS9vKQorICovCisjZGVmaW5lIFdNODM1MF9HUDEyX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0dQMTFfRElSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfR1AxMF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9HUDlfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0dQOF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfR1A3X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9HUDZfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0dQNV9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfR1A0X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9HUDNfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0dQMl9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfR1AxX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9HUDBfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMzUgKDB4ODcpIC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfR1AxMV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9HUDEwX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0dQOV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfR1A4X0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9HUDdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0dQNl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfR1A1X0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9HUDRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0dQM19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfR1AyX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9HUDFfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0dQMF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjE0MCAoMHg4QykgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxCisgKi8KKyNkZWZpbmUgV004MzUwX0dQM19GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4RjAwMAorI2RlZmluZSBXTTgzNTBfR1AyX0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIFdNODM1MF9HUDFfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwRjAKKyNkZWZpbmUgV004MzUwX0dQMF9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorCisvKgorICogUjE0MSAoMHg4RCkgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyCisgKi8KKyNkZWZpbmUgV004MzUwX0dQN19GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4RjAwMAorI2RlZmluZSBXTTgzNTBfR1A2X0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIFdNODM1MF9HUDVfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwRjAKKyNkZWZpbmUgV004MzUwX0dQNF9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorCisvKgorICogUjE0MiAoMHg4RSkgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAzCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTFfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RjAwMAorI2RlZmluZSBXTTgzNTBfR1AxMF9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIFdNODM1MF9HUDlfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwRjAKKyNkZWZpbmUgV004MzUwX0dQOF9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorCisvKgorICogUjE0MyAoMHg4RikgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0CisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorCisvKgorICogUjIzMCAoMHhFNikgLSBHUElPIFBpbiBTdGF0dXMKKyAqLworI2RlZmluZSBXTTgzNTBfR1AxMl9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9HUDExX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0dQMTBfTFZMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfR1A5X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9HUDhfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0dQN19MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfR1A2X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9HUDVfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0dQNF9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfR1AzX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9HUDJfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0dQMV9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfR1AwX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKK3N0cnVjdCB3bTgzNTA7CisKK2ludCB3bTgzNTBfZ3Bpb19jb25maWcoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgZ3BpbywgaW50IGRpciwgaW50IGZ1bmMsCisJCSAgICAgICBpbnQgcG9sLCBpbnQgcHVsbCwgaW50IGludmVydCwgaW50IGRlYm91bmNlKTsKKworc3RydWN0IHdtODM1MF9ncGlvIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworfTsKKworLyoKKyAqIEdQSU8gSW50ZXJydXB0cworICovCisjZGVmaW5lIFdNODM1MF9JUlFfR1BJTyh4KSAgICAgICAgICAgICAgICAgICAgICAoNTAgKyB4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9wbWljLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcG1pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjY5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcG1pYy5oCkBAIC0wLDAgKzEsNzQxIEBACisvKgorICogcG1pYy5oICAtLSAgUG93ZXIgTWFuYWdtZW50IERyaXZlciBmb3IgV29sZnNvbiBXTTgzNTAgUE1JQworICoKKyAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9XTTgzNTBfUE1JQ19ICisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODM1MF9QTUlDX0gKKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworCisjZGVmaW5lIFdNODM1MF9DVVJSRU5UX1NJTktfRFJJVkVSX0EgICAgICAgICAgICAweEFDCisjZGVmaW5lIFdNODM1MF9DU0FfRkxBU0hfQ09OVFJPTCAgICAgICAgICAgICAgICAweEFECisjZGVmaW5lIFdNODM1MF9DVVJSRU5UX1NJTktfRFJJVkVSX0IgICAgICAgICAgICAweEFFCisjZGVmaW5lIFdNODM1MF9DU0JfRkxBU0hfQ09OVFJPTCAgICAgICAgICAgICAgICAweEFGCisjZGVmaW5lIFdNODM1MF9EQ0RDX0xET19SRVFVRVNURUQgICAgICAgICAgICAgICAweEIwCisjZGVmaW5lIFdNODM1MF9EQ0RDX0FDVElWRV9PUFRJT05TICAgICAgICAgICAgICAweEIxCisjZGVmaW5lIFdNODM1MF9EQ0RDX1NMRUVQX09QVElPTlMgICAgICAgICAgICAgICAweEIyCisjZGVmaW5lIFdNODM1MF9QT1dFUl9DSEVDS19DT01QQVJBVE9SICAgICAgICAgICAweEIzCisjZGVmaW5lIFdNODM1MF9EQ0RDMV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAweEI0CisjZGVmaW5lIFdNODM1MF9EQ0RDMV9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAweEI1CisjZGVmaW5lIFdNODM1MF9EQ0RDMV9MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAweEI2CisjZGVmaW5lIFdNODM1MF9EQ0RDMl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAweEI3CisjZGVmaW5lIFdNODM1MF9EQ0RDMl9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAweEI4CisjZGVmaW5lIFdNODM1MF9EQ0RDM19DT05UUk9MICAgICAgICAgICAgICAgICAgICAweEJBCisjZGVmaW5lIFdNODM1MF9EQ0RDM19USU1FT1VUUyAgICAgICAgICAgICAgICAgICAweEJCCisjZGVmaW5lIFdNODM1MF9EQ0RDM19MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAweEJDCisjZGVmaW5lIFdNODM1MF9EQ0RDNF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAweEJECisjZGVmaW5lIFdNODM1MF9EQ0RDNF9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAweEJFCisjZGVmaW5lIFdNODM1MF9EQ0RDNF9MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAweEJGCisjZGVmaW5lIFdNODM1MF9EQ0RDNV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAweEMwCisjZGVmaW5lIFdNODM1MF9EQ0RDNV9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAweEMxCisjZGVmaW5lIFdNODM1MF9EQ0RDNl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAweEMzCisjZGVmaW5lIFdNODM1MF9EQ0RDNl9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAweEM0CisjZGVmaW5lIFdNODM1MF9EQ0RDNl9MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAweEM1CisjZGVmaW5lIFdNODM1MF9MSU1JVF9TV0lUQ0hfQ09OVFJPTCAgICAgICAgICAgICAweEM3CisjZGVmaW5lIFdNODM1MF9MRE8xX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweEM4CisjZGVmaW5lIFdNODM1MF9MRE8xX1RJTUVPVVRTICAgICAgICAgICAgICAgICAgICAweEM5CisjZGVmaW5lIFdNODM1MF9MRE8xX0xPV19QT1dFUiAgICAgICAgICAgICAgICAgICAweENBCisjZGVmaW5lIFdNODM1MF9MRE8yX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweENCCisjZGVmaW5lIFdNODM1MF9MRE8yX1RJTUVPVVRTICAgICAgICAgICAgICAgICAgICAweENDCisjZGVmaW5lIFdNODM1MF9MRE8yX0xPV19QT1dFUiAgICAgICAgICAgICAgICAgICAweENECisjZGVmaW5lIFdNODM1MF9MRE8zX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweENFCisjZGVmaW5lIFdNODM1MF9MRE8zX1RJTUVPVVRTICAgICAgICAgICAgICAgICAgICAweENGCisjZGVmaW5lIFdNODM1MF9MRE8zX0xPV19QT1dFUiAgICAgICAgICAgICAgICAgICAweEQwCisjZGVmaW5lIFdNODM1MF9MRE80X0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweEQxCisjZGVmaW5lIFdNODM1MF9MRE80X1RJTUVPVVRTICAgICAgICAgICAgICAgICAgICAweEQyCisjZGVmaW5lIFdNODM1MF9MRE80X0xPV19QT1dFUiAgICAgICAgICAgICAgICAgICAweEQzCisjZGVmaW5lIFdNODM1MF9WQ0NfRkFVTFRfTUFTS1MgICAgICAgICAgICAgICAgICAweEQ3CisjZGVmaW5lIFdNODM1MF9NQUlOX0JBTkRHQVBfQ09OVFJPTCAgICAgICAgICAgICAweEQ4CisjZGVmaW5lIFdNODM1MF9PU0NfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAweEQ5CisjZGVmaW5lIFdNODM1MF9SVENfVElDS19DT05UUk9MICAgICAgICAgICAgICAgICAweERBCisjZGVmaW5lIFdNODM1MF9TRUNVUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAweERCCisjZGVmaW5lIFdNODM1MF9SQU1fQklTVF8xICAgICAgICAgICAgICAgICAgICAgICAweERDCisjZGVmaW5lIFdNODM1MF9EQ0RDX0xET19TVEFUVVMgICAgICAgICAgICAgICAgICAweEUxCisjZGVmaW5lIFdNODM1MF9HUElPX1BJTl9TVEFUVVMgICAgICAgICAgICAgICAgICAweEU2CisKKyNkZWZpbmUgV004MzUwX0RDREMxX0ZPUkNFX1BXTSAgICAgICAgICAgICAgICAgIDB4RjgKKyNkZWZpbmUgV004MzUwX0RDREMzX0ZPUkNFX1BXTSAgICAgICAgICAgICAgICAgIDB4RkEKKyNkZWZpbmUgV004MzUwX0RDREM0X0ZPUkNFX1BXTSAgICAgICAgICAgICAgICAgIDB4RkIKKyNkZWZpbmUgV004MzUwX0RDREM2X0ZPUkNFX1BXTSAgICAgICAgICAgICAgICAgIDB4RkQKKworLyoKKyAqIFIxNzIgKDB4QUMpIC0gQ3VycmVudCBTaW5rIERyaXZlciBBCisgKi8KKyNkZWZpbmUgV004MzUwX0NTMV9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQ1MxX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9DUzFfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV004MzUwX0NTMV9JU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzRgorI2RlZmluZSBXTTgzNTBfQ1MxX0lTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIxNzIgKDB4QUMpICovCisjZGVmaW5lIFdNODM1MF9DUzFfSElCX01PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0NTMV9ISUJfTU9ERV9MRUFWRSAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9DUzFfSVNFTF8yMjBNICAgICAgICAgICAgICAgICAgICAgIDB4M0YKKworLyoKKyAqIFIxNzMgKDB4QUQpIC0gQ1NBIEZsYXNoIGNvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfQ1MxX0ZMQVNIX01PREUgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9DUzFfVFJJR1NSQyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0NTMV9EUklWRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQ1MxX0ZMQVNIX0RVUl9NQVNLICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9DUzFfT0ZGX1JBTVBfTUFTSyAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0NTMV9PTl9SQU1QX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMworCisvKgorICogUjE3NCAoMHhBRSkgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEIKKyAqLworI2RlZmluZSBXTTgzNTBfQ1MyX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9DUzJfSVNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwM0YKKworLyoKKyAqIFIxNzUgKDB4QUYpIC0gQ1NCIEZsYXNoIGNvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfQ1MyX0ZMQVNIX01PREUgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9DUzJfVFJJR1NSQyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0NTMl9EUklWRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQ1MyX0ZMQVNIX0RVUl9NQVNLICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9DUzJfT0ZGX1JBTVBfTUFTSyAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0NTMl9PTl9SQU1QX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMworCisvKgorICogUjE3NiAoMHhCMCkgLSBEQ0RDL0xETyByZXF1ZXN0ZWQKKyAqLworI2RlZmluZSBXTTgzNTBfTFNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9MRE80X0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0xETzNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfTERPMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9MRE8xX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0RDNl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfREM1X0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9EQzRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0RDM19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfREMyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9EQzFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxNzcgKDB4QjEpIC0gRENEQyBBY3RpdmUgb3B0aW9ucworICovCisjZGVmaW5lIFdNODM1MF9QVVRPX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgV004MzUwX1BXUlVQX0RFTEFZX01BU0sgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfREM2X0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9EQzRfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0RDM19BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfREMxX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTc4ICgweEIyKSAtIERDREMgU2xlZXAgb3B0aW9ucworICovCisjZGVmaW5lIFdNODM1MF9EQzZfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0RDNF9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfREMzX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9EQzFfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxNzkgKDB4QjMpIC0gUG93ZXItY2hlY2sgY29tcGFyYXRvcgorICovCisjZGVmaW5lIFdNODM1MF9QQ0NNUF9FUlJBQ1QgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX1BDQ01QX1JBSUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfUENDTVBfT0ZGX1RIUl9NQVNLICAgICAgICAgICAgICAgMHgwMDcwCisjZGVmaW5lIFdNODM1MF9QQ0NNUF9PTl9USFJfTUFTSyAgICAgICAgICAgICAgICAweDAwMDcKKworLyoKKyAqIFIxODAgKDB4QjQpIC0gRENEQzEgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQzFfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0RDMV9WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorI2RlZmluZSBXTTgzNTBfREMxX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMTgxICgweEI1KSAtIERDREMxIFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDMV9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfREMxX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzFfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0RDMV9FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfREMxX1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9EQzFfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0RDMV9TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMTgxICgweEI1KSAqLworI2RlZmluZSBXTTgzNTBfREMxX0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzFfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDMV9FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorCisvKgorICogUjE4MiAoMHhCNikgLSBEQ0RDMSBMb3cgUG93ZXIKKyAqLworI2RlZmluZSBXTTgzNTBfREMxX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIFdNODM1MF9EQzFfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0RDMV9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorCisvKgorICogUjE4MyAoMHhCNykgLSBEQ0RDMiBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RDMl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfREMyX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9EQzJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfREMyX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9EQzJfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfVFJJR19NQVNLICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfREMyX0hJQl9UUklHX1NISUZUICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9EQzJfSUxJTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0RDMl9JTElNX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfREMyX0lMSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFdNODM1MF9EQzJfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgV004MzUwX0RDMl9STVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfREMyX0ZCU1JDX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFdNODM1MF9EQzJfRkJTUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogQml0IHZhbHVlcyBmb3IgUjE4MyAoMHhCNykgKi8KKyNkZWZpbmUgV004MzUwX0RDMl9NT0RFX0JPT1NUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREMyX01PREVfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfTU9ERV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREMyX0hJQl9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfVFJJR19OT05FICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREMyX0hJQl9UUklHX0xQV1IxICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzJfSElCX1RSSUdfTFBXUjIgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfVFJJR19MUFdSMyAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFdNODM1MF9EQzJfSUxJTV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDMl9JTElNX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9EQzJfUk1QXzMwViAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDMl9STVBfMjBWICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREMyX1JNUF8xMFYgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9EQzJfUk1QXzVWICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBXTTgzNTBfREMyX0ZCU1JDX0ZCMiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzJfRkJTUkNfSVNJTktBICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDMl9GQlNSQ19JU0lOS0IgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfREMyX0ZCU1JDX1VTQiAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKy8qCisgKiBSMTg0ICgweEI4KSAtIERDREMyIFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDMl9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfREMyX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzJfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0RDMl9FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfREMyX1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9EQzJfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAKKworLyogQml0IHZhbHVlcyBmb3IgUjE4NCAoMHhCOCkgKi8KKyNkZWZpbmUgV004MzUwX0RDMl9FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREMyX0VSUkFDVF9TSFVURE9XTl9DT05WICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzJfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIxODYgKDB4QkEpIC0gRENEQzMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQzNfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0RDM19WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorI2RlZmluZSBXTTgzNTBfREMzX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMTg3ICgweEJCKSAtIERDREMzIFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDM19FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfREMzX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzNfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0RDM19FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfREMzX1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9EQzNfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0RDM19TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMTg3ICgweEJCKSAqLworI2RlZmluZSBXTTgzNTBfREMzX0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzNfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDM19FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorLyoKKyAqIFIxODggKDB4QkMpIC0gRENEQzMgTG93IFBvd2VyCisgKi8KKyNkZWZpbmUgV004MzUwX0RDM19ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBXTTgzNTBfREMzX0hJQl9UUklHX01BU0sgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9EQzNfVklNR19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YKKworLyoKKyAqIFIxODkgKDB4QkQpIC0gRENEQzQgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQzRfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0RDNF9WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorI2RlZmluZSBXTTgzNTBfREM0X1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMTkwICgweEJFKSAtIERDREM0IFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDNF9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfREM0X0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzRfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0RDNF9FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfREM0X1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9EQzRfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0RDNF9TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMTkwICgweEJFKSAqLworI2RlZmluZSBXTTgzNTBfREM0X0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzRfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDNF9FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorCisvKgorICogUjE5MSAoMHhCRikgLSBEQ0RDNCBMb3cgUG93ZXIKKyAqLworI2RlZmluZSBXTTgzNTBfREM0X0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIFdNODM1MF9EQzRfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0RDNF9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorCisvKgorICogUjE5MiAoMHhDMCkgLSBEQ0RDNSBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RDNV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfREM1X01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9EQzVfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfREM1X0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9EQzVfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfVFJJR19NQVNLICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfREM1X0hJQl9UUklHX1NISUZUICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9EQzVfSUxJTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0RDNV9JTElNX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfREM1X0lMSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFdNODM1MF9EQzVfUk1QX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgV004MzUwX0RDNV9STVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfREM1X0ZCU1JDX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFdNODM1MF9EQzVfRkJTUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogQml0IHZhbHVlcyBmb3IgUjE5MiAoMHhDMCkgKi8KKyNkZWZpbmUgV004MzUwX0RDNV9NT0RFX0JPT1NUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREM1X01PREVfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfTU9ERV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREM1X0hJQl9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfVFJJR19OT05FICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREM1X0hJQl9UUklHX0xQV1IxICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzVfSElCX1RSSUdfTFBXUjIgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfVFJJR19MUFdSMyAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFdNODM1MF9EQzVfSUxJTV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDNV9JTElNX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9EQzVfUk1QXzMwViAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDNV9STVBfMjBWICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREM1X1JNUF8xMFYgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9EQzVfUk1QXzVWICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBXTTgzNTBfREM1X0ZCU1JDX0ZCMiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzVfRkJTUkNfSVNJTktBICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDNV9GQlNSQ19JU0lOS0IgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfREM1X0ZCU1JDX1VTQiAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKy8qCisgKiBSMTkzICgweEMxKSAtIERDREM1IFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDNV9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfREM1X0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzVfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0RDNV9FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfREM1X1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9EQzVfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0RDNV9TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMTkzICgweEMxKSAqLworI2RlZmluZSBXTTgzNTBfREM1X0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzVfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDNV9FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorCisvKgorICogUjE5NSAoMHhDMykgLSBEQ0RDNiBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RDNl9PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfREM2X1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGCisjZGVmaW5lIFdNODM1MF9EQzZfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqIFIxOTYgKDB4QzQpIC0gRENEQzYgVGltZW91dHMKKyAqLworI2RlZmluZSBXTTgzNTBfREM2X0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIFdNODM1MF9EQzZfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV004MzUwX0RDNl9FTlNMT1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4M0MwMAorI2RlZmluZSBXTTgzNTBfREM2X0VOU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdNODM1MF9EQzZfU0RTTE9UX01BU0sgICAgICAgICAgICAgICAgICAweDAzQzAKKyNkZWZpbmUgV004MzUwX0RDNl9VVlRPX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBXTTgzNTBfREM2X1NEU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA2CisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIxOTYgKDB4QzQpICovCisjZGVmaW5lIFdNODM1MF9EQzZfRVJSQUNUX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDNl9FUlJBQ1RfU0hVVERPV05fQ09OViAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREM2X0VSUkFDVF9TSFVURE9XTl9TWVMgICAgICAgICAgICAgICAyCisKKy8qCisgKiBSMTk3ICgweEM1KSAtIERDREM2IExvdyBQb3dlcgorICovCisjZGVmaW5lIFdNODM1MF9EQzZfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgV004MzUwX0RDNl9ISUJfVFJJR19NQVNLICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfREM2X1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGCisKKy8qCisgKiBSMTk5ICgweEM3KSAtIExpbWl0IFN3aXRjaCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0xTX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfTFNfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9MU19FTlNMT1RfTUFTSyAgICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0xTX0VOU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfTFNfU0RTTE9UX01BU0sgICAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9MU19TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX0xTX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfTFNfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9MU19ISUJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV004MzUwX0xTX0hJQl9QUk9UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfTFNfSElCX1BST1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9MU19ISUJfUFJPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0xTX1BST1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBXTTgzNTBfTFNfUFJPVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFdNODM1MF9MU19QUk9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogQml0IHZhbHVlcyBmb3IgUjE5OSAoMHhDNykgKi8KKyNkZWZpbmUgV004MzUwX0xTX0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9MU19FUlJBQ1RfU0hVVERPV05fQ09OViAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfTFNfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIyMDAgKDB4QzgpIC0gTERPMSBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzFfU1dJICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfTERPMV9PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9MRE8xX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYKKyNkZWZpbmUgV004MzUwX0xETzFfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogUjIwMSAoMHhDOSkgLSBMRE8xIFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzFfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfTERPMV9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9MRE8xX0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0xETzFfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfTERPMV9TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9MRE8xX1VWVE9fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0xETzFfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMjAxICgweEM5KSAqLworI2RlZmluZSBXTTgzNTBfTERPMV9FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfTERPMV9FUlJBQ1RfU0hVVERPV05fQ09OViAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfTERPMV9FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorCisvKgorICogUjIwMiAoMHhDQSkgLSBMRE8xIExvdyBQb3dlcgorICovCisjZGVmaW5lIFdNODM1MF9MRE8xX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgV004MzUwX0xETzFfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfTERPMV9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFGCisjZGVmaW5lIFdNODM1MF9MRE8xX0hJQl9NT0RFX0RJUwkJKDB4MSA8PCAxMikKKworCisvKgorICogUjIwMyAoMHhDQikgLSBMRE8yIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfTERPMl9TV0kgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9MRE8yX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0xETzJfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRgorI2RlZmluZSBXTTgzNTBfTERPMl9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMjA0ICgweENDKSAtIExETzIgVGltZW91dHMKKyAqLworI2RlZmluZSBXTTgzNTBfTERPMl9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIFdNODM1MF9MRE8yX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV004MzUwX0xETzJfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgIDB4M0MwMAorI2RlZmluZSBXTTgzNTBfTERPMl9FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdNODM1MF9MRE8yX1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAweDAzQzAKKyNkZWZpbmUgV004MzUwX0xETzJfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMjA0ICgweENDKSAqLworI2RlZmluZSBXTTgzNTBfTERPMl9FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfTERPMl9FUlJBQ1RfU0hVVERPV05fQ09OViAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfTERPMl9FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorCisvKgorICogUjIwNSAoMHhDRCkgLSBMRE8yIExvdyBQb3dlcgorICovCisjZGVmaW5lIFdNODM1MF9MRE8yX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgV004MzUwX0xETzJfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfTERPMl9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFGCisKKy8qCisgKiBSMjA2ICgweENFKSAtIExETzMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9MRE8zX1NXSSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0xETzNfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfTERPM19WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFGCisjZGVmaW5lIFdNODM1MF9MRE8zX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqIFIyMDcgKDB4Q0YpIC0gTERPMyBUaW1lb3V0cworICovCisjZGVmaW5lIFdNODM1MF9MRE8zX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0xETzNfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfTERPM19FTlNMT1RfTUFTSyAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9MRE8zX0VOU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0xETzNfU0RTTE9UX01BU0sgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfTERPM19VVlRPX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9MRE8zX1NEU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYKKworLyogQml0IHZhbHVlcyBmb3IgUjIwNyAoMHhDRikgKi8KKyNkZWZpbmUgV004MzUwX0xETzNfRVJSQUNUX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0xETzNfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0xETzNfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIyMDggKDB4RDApIC0gTERPMyBMb3cgUG93ZXIKKyAqLworI2RlZmluZSBXTTgzNTBfTERPM19ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIFdNODM1MF9MRE8zX0hJQl9UUklHX01BU0sgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0xETzNfVklNR19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRgorCisvKgorICogUjIwOSAoMHhEMSkgLSBMRE80IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfTERPNF9TV0kgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9MRE80X09QRkxUICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0xETzRfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRgorI2RlZmluZSBXTTgzNTBfTERPNF9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMjEwICgweEQyKSAtIExETzQgVGltZW91dHMKKyAqLworI2RlZmluZSBXTTgzNTBfTERPNF9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIFdNODM1MF9MRE80X0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV004MzUwX0xETzRfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgIDB4M0MwMAorI2RlZmluZSBXTTgzNTBfTERPNF9FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdNODM1MF9MRE80X1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAweDAzQzAKKyNkZWZpbmUgV004MzUwX0xETzRfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBXTTgzNTBfTERPNF9TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICA2CisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIyMTAgKDB4RDIpICovCisjZGVmaW5lIFdNODM1MF9MRE80X0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9MRE80X0VSUkFDVF9TSFVURE9XTl9DT05WICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9MRE80X0VSUkFDVF9TSFVURE9XTl9TWVMgICAgICAgICAgICAgICAyCisKKy8qCisgKiBSMjExICgweEQzKSAtIExETzQgTG93IFBvd2VyCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzRfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBXTTgzNTBfTERPNF9ISUJfVFJJR19NQVNLICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9MRE80X1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYKKworLyoKKyAqIFIyMTUgKDB4RDcpIC0gVkNDX0ZBVUxUIE1hc2tzCisgKi8KKyNkZWZpbmUgV004MzUwX0xTX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfTERPNF9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9MRE8zX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0xETzJfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfTERPMV9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9EQzZfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0RDNV9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfREM0X0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9EQzNfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0RDMl9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfREMxX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMjE2ICgweEQ4KSAtIE1haW4gQmFuZGdhcCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX01CR19MT0FEX0ZVU0VTICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfTUJHX0ZVU0VfV1BSRVAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9NQkdfRlVTRV9XUklURSAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX01CR19GVVNFX1RSSU1fTUFTSyAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBXTTgzNTBfTUJHX1RSSU1fU1JDICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9NQkdfVVNFUl9UUklNX01BU0sgICAgICAgICAgICAgICAweDAwMUYKKworLyoKKyAqIFIyMTcgKDB4RDkpIC0gT1NDIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfT1NDX0xPQURfRlVTRVMgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9PU0NfRlVTRV9XUFJFUCAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX09TQ19GVVNFX1dSSVRFICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfT1NDX0ZVU0VfVFJJTV9NQVNLICAgICAgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIFdNODM1MF9PU0NfVFJJTV9TUkMgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX09TQ19VU0VSX1RSSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDAwRgorCisvKgorICogUjI0OCAoMHhGOCkgLSBEQ0RDMSBGb3JjZSBQV00KKyAqLworI2RlZmluZSBXTTgzNTBfRENEQzFfRk9SQ0VfUFdNX0VOQSAgICAgICAgICAgICAgMHgwMDEwCisKKy8qCisgKiBSMjUwICgweEZBKSAtIERDREMzIEZvcmNlIFBXTQorICovCisjZGVmaW5lIFdNODM1MF9EQ0RDM19GT1JDRV9QV01fRU5BICAgICAgICAgICAgICAweDAwMTAKKworLyoKKyAqIFIyNTEgKDB4RkIpIC0gRENEQzQgRm9yY2UgUFdNCisgKi8KKyNkZWZpbmUgV004MzUwX0RDREM0X0ZPUkNFX1BXTV9FTkEgICAgICAgICAgICAgIDB4MDAxMAorCisvKgorICogUjI1MyAoMHhGRCkgLSBEQ0RDMSBGb3JjZSBQV00KKyAqLworI2RlZmluZSBXTTgzNTBfRENEQzZfRk9SQ0VfUFdNX0VOQSAgICAgICAgICAgICAgMHgwMDEwCisKKy8qCisgKiBEQ0RDJ3MKKyAqLworI2RlZmluZSBXTTgzNTBfRENEQ18xCQkJCTAKKyNkZWZpbmUgV004MzUwX0RDRENfMgkJCQkxCisjZGVmaW5lIFdNODM1MF9EQ0RDXzMJCQkJMgorI2RlZmluZSBXTTgzNTBfRENEQ180CQkJCTMKKyNkZWZpbmUgV004MzUwX0RDRENfNQkJCQk0CisjZGVmaW5lIFdNODM1MF9EQ0RDXzYJCQkJNQorCisvKiBEQ0RDIG1vZGVzICovCisjZGVmaW5lIFdNODM1MF9EQ0RDX0FDVElWRV9TVEFOREJZCQkwCisjZGVmaW5lIFdNODM1MF9EQ0RDX0FDVElWRV9QVUxTRQkJMQorI2RlZmluZSBXTTgzNTBfRENEQ19TTEVFUF9OT1JNQUwJCTAKKyNkZWZpbmUgV004MzUwX0RDRENfU0xFRVBfTE9XCQkJMQorCisvKiBEQ0RDIExvdyBwb3dlciAoSGliZXJuYXRlKSBtb2RlICovCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9NT0RFX0NVUgkJKDAgPDwgMTIpCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9NT0RFX0lNQUdFCQkoMSA8PCAxMikKKyNkZWZpbmUgV004MzUwX0RDRENfSElCX01PREVfU1RBTkRCWQkJKDIgPDwgMTIpCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9NT0RFX0xETwkJKDQgPDwgMTIpCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9NT0RFX0xET19JTQkJKDUgPDwgMTIpCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9NT0RFX0RJUwkJKDcgPDwgMTIpCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0sJCSg3IDw8IDEyKQorCisvKiBEQ0RDIExvdyBQb3dlciAoSGliZXJuYXRlKSBzaWduYWwgKi8KKyNkZWZpbmUgV004MzUwX0RDRENfSElCX1NJR19SRUcJCQkoMCA8PCA4KQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfU0lHX0xQV1IxCQkoMSA8PCA4KQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfU0lHX0xQV1IyCQkoMiA8PCA4KQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfU0lHX0xQV1IzCQkoMyA8PCA4KQorCisvKiBMRE8gTG93IHBvd2VyIChIaWJlcm5hdGUpIG1vZGUgKi8KKyNkZWZpbmUgV004MzUwX0xET19ISUJfTU9ERV9JTUFHRQkJKDAgPDwgMCkKKyNkZWZpbmUgV004MzUwX0xET19ISUJfTU9ERV9ESVMJCQkoMSA8PCAwKQorCisvKiBMRE8gTG93IFBvd2VyIChIaWJlcm5hdGUpIHNpZ25hbCAqLworI2RlZmluZSBXTTgzNTBfTERPX0hJQl9TSUdfUkVHCQkJKDAgPDwgOCkKKyNkZWZpbmUgV004MzUwX0xET19ISUJfU0lHX0xQV1IxCQkoMSA8PCA4KQorI2RlZmluZSBXTTgzNTBfTERPX0hJQl9TSUdfTFBXUjIJCSgyIDw8IDgpCisjZGVmaW5lIFdNODM1MF9MRE9fSElCX1NJR19MUFdSMwkJKDMgPDwgOCkKKworLyoKKyAqIExET3MKKyAqLworI2RlZmluZSBXTTgzNTBfTERPXzEJCQkJNgorI2RlZmluZSBXTTgzNTBfTERPXzIJCQkJNworI2RlZmluZSBXTTgzNTBfTERPXzMJCQkJOAorI2RlZmluZSBXTTgzNTBfTERPXzQJCQkJOQorCisvKgorICogSVNJTktzCisgKi8KKyNkZWZpbmUgV004MzUwX0lTSU5LX0EJCQkJMTAKKyNkZWZpbmUgV004MzUwX0lTSU5LX0IJCQkJMTEKKworI2RlZmluZSBXTTgzNTBfSVNJTktfTU9ERV9CT09TVAkJCTAKKyNkZWZpbmUgV004MzUwX0lTSU5LX01PREVfU1dJVENICQkxCisjZGVmaW5lIFdNODM1MF9JU0lOS19JTElNX05PUk1BTAkJMAorI2RlZmluZSBXTTgzNTBfSVNJTktfSUxJTV9MT1cJCQkxCisKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX0RJU0FCTEUJCTAKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX0VOQUJMRQkJMQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfVFJJR19CSVQJCTAKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX1RSSUdfR1BJTwkJMQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfTU9ERV9FTgkJKDEgPDwgMTMpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9NT0RFX0RJUwkJKDAgPDwgMTMpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9EVVJfMzJNUwkJKDAgPDwgOCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX0RVUl82NE1TCQkoMSA8PCA4KQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfRFVSXzk2TVMJCSgyIDw8IDgpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9EVVJfMTAyNE1TCQkoMyA8PCA4KQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT05fSU5TVEFOVAkJKDAgPDwgNCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09OXzBfMjVTCQkoMSA8PCA0KQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT05fMF81MFMJCSgyIDw8IDQpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9PTl8xXzAwUwkJKDMgPDwgNCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09OXzFfOTVTCQkoMSA8PCA0KQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT05fM185MVMJCSgyIDw8IDQpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9PTl83XzgwUwkJKDMgPDwgNCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09GRl9JTlNUQU5UCQkoMCA8PCAwKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT0ZGXzBfMjVTCQkoMSA8PCAwKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT0ZGXzBfNTBTCQkoMiA8PCAwKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT0ZGXzFfMDBTCQkoMyA8PCAwKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT0ZGXzFfOTVTCQkoMSA8PCAwKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT0ZGXzNfOTFTCQkoMiA8PCAwKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT0ZGXzdfODBTCQkoMyA8PCAwKQorCisvKgorICogUmVndWxhdG9yIEludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgV004MzUwX0lSUV9DUzEJCQkJMTMKKyNkZWZpbmUgV004MzUwX0lSUV9DUzIJCQkJMTQKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9MRE80CQkJMjUKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9MRE8zCQkJMjYKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9MRE8yCQkJMjcKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9MRE8xCQkJMjgKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9EQzYJCQkyOQorI2RlZmluZSBXTTgzNTBfSVJRX1VWX0RDNQkJCTMwCisjZGVmaW5lIFdNODM1MF9JUlFfVVZfREM0CQkJMzEKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9EQzMJCQkzMgorI2RlZmluZSBXTTgzNTBfSVJRX1VWX0RDMgkJCTMzCisjZGVmaW5lIFdNODM1MF9JUlFfVVZfREMxCQkJMzQKKyNkZWZpbmUgV004MzUwX0lSUV9PQ19MUwkJCTM1CisKKyNkZWZpbmUgTlVNX1dNODM1MF9SRUdVTEFUT1JTCQkJMTIKKworc3RydWN0IHdtODM1MDsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CitzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YTsKKworc3RydWN0IHdtODM1MF9wbWljIHsKKwkvKiBJU0lOSyB0byBEQ0RDIG1hcHBpbmcgKi8KKwlpbnQgaXNpbmtfQV9kY2RjOworCWludCBpc2lua19CX2RjZGM7CisKKwkvKiBoaWJlcm5hdGUgY29uZmlncyAqLworCXUxNiBkY2RjMV9oaWJfbW9kZTsKKwl1MTYgZGNkYzNfaGliX21vZGU7CisJdTE2IGRjZGM0X2hpYl9tb2RlOworCXUxNiBkY2RjNl9oaWJfbW9kZTsKKworCS8qIHJlZ3VsYXRvciBkZXZpY2VzICovCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldltOVU1fV004MzUwX1JFR1VMQVRPUlNdOworfTsKKworaW50IHdtODM1MF9yZWdpc3Rlcl9yZWd1bGF0b3Ioc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgcmVnLAorCQkJICAgICAgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRkYXRhKTsKKworLyoKKyAqIEFkZGl0aW9uYWwgRENEQyBjb250cm9sIG5vdCBzdXBwb3J0ZWQgdmlhIHJlZ3VsYXRvciBBUEkKKyAqLworaW50IHdtODM1MF9kY2RjX3NldF9zbG90KHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGRjZGMsIHUxNiBzdGFydCwKKwkJCSB1MTYgc3RvcCwgdTE2IGZhdWx0KTsKK2ludCB3bTgzNTBfZGNkYzI1X3NldF9tb2RlKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGRjZGMsIHUxNiBtb2RlLAorCQkJICAgdTE2IGlsaW0sIHUxNiByYW1wLCB1MTYgZmVlZGJhY2spOworCisvKgorICogQWRkaXRpb25hbCBMRE8gY29udHJvbCBub3Qgc3VwcG9ydGVkIHZpYSByZWd1bGF0b3IgQVBJCisgKi8KK2ludCB3bTgzNTBfbGRvX3NldF9zbG90KHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGxkbywgdTE2IHN0YXJ0LCB1MTYgc3RvcCk7CisKKy8qCisgKiBBZGRpdGlvbmFsIElTSU5LIGNvbnRyb2wgbm90IHN1cHBvcnRlZCB2aWEgcmVndWxhdG9yIEFQSQorICovCitpbnQgd204MzUwX2lzaW5rX3NldF9mbGFzaChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpc2luaywgdTE2IG1vZGUsCisJCQkgICB1MTYgdHJpZ2dlciwgdTE2IGR1cmF0aW9uLCB1MTYgb25fcmFtcCwKKwkJCSAgIHUxNiBvZmZfcmFtcCwgdTE2IGRyaXZlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcnRjLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkYTY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9ydGMuaApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIHJ0Yy5oICAtLSAgUlRDIGRyaXZlciBmb3IgV29sZnNvbiBXTTgzNTAgUE1JQworICoKKyAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODM1MF9SVENfSAorI2RlZmluZSBfX0xJTlVYX01GRF9XTTgzNTBfUlRDX0gKKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisvKgorICogUmVnaXN0ZXIgdmFsdWVzLgorICovCisjZGVmaW5lIFdNODM1MF9SVENfU0VDT05EU19NSU5VVEVTICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFdNODM1MF9SVENfSE9VUlNfREFZICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFdNODM1MF9SVENfREFURV9NT05USCAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFdNODM1MF9SVENfWUVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIFdNODM1MF9BTEFSTV9TRUNPTkRTX01JTlVURVMgICAgICAgICAgICAweDE0CisjZGVmaW5lIFdNODM1MF9BTEFSTV9IT1VSU19EQVkgICAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIFdNODM1MF9BTEFSTV9EQVRFX01PTlRIICAgICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIFdNODM1MF9SVENfVElNRV9DT05UUk9MICAgICAgICAgICAgICAgICAweDE3CisKKy8qCisgKiBSMTYgKDB4MTApIC0gUlRDIFNlY29uZHMvTWludXRlcworICovCisjZGVmaW5lIFdNODM1MF9SVENfTUlOU19NQVNLICAgICAgICAgICAgICAgICAgICAweDdGMDAKKyNkZWZpbmUgV004MzUwX1JUQ19NSU5TX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfUlRDX1NFQ1NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGCisjZGVmaW5lIFdNODM1MF9SVENfU0VDU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqIFIxNyAoMHgxMSkgLSBSVEMgSG91cnMvRGF5CisgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19EQVlfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDcwMAorI2RlZmluZSBXTTgzNTBfUlRDX0RBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9SVENfSFBNX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX1JUQ19IUE1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBXTTgzNTBfUlRDX0hSU19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDFGCisjZGVmaW5lIFdNODM1MF9SVENfSFJTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogQml0IHZhbHVlcyBmb3IgUjIxICgweDE1KSAqLworI2RlZmluZSBXTTgzNTBfUlRDX0RBWV9TVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9SVENfREFZX01PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX1JUQ19EQVlfVFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfUlRDX0RBWV9XRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9SVENfREFZX1RIVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX1JUQ19EQVlfRlJJICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfUlRDX0RBWV9TQVQgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgV004MzUwX1JUQ19IUE1fQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfUlRDX0hQTV9QTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qCisgKiBSMTggKDB4MTIpIC0gUlRDIERhdGUvTW9udGgKKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX01USF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19EQVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzRgorI2RlZmluZSBXTTgzNTBfUlRDX0RBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIyMiAoMHgxNikgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfSkFOICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfUlRDX01USF9GRUIgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX01BUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfQVBSICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfUlRDX01USF9NQVkgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0pVTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfSlVMICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBXTTgzNTBfUlRDX01USF9BVUcgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX1NFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfT0NUICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfUlRDX01USF9OT1YgICAgICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0RFQyAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfSkFOX0JDRCAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTgzNTBfUlRDX01USF9GRUJfQkNEICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX01BUl9CQ0QgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfQVBSX0JDRCAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXTTgzNTBfUlRDX01USF9NQVlfQkNEICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0pVTl9CQ0QgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfSlVMX0JDRCAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBXTTgzNTBfUlRDX01USF9BVUdfQkNEICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX1NFUF9CQ0QgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfT0NUX0JDRCAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTgzNTBfUlRDX01USF9OT1ZfQkNEICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0RFQ19CQ0QgICAgICAgICAgICAgICAgICAgIDB4MTIKKworLyoKKyAqIFIxOSAoMHgxMykgLSBSVEMgWWVhcgorICovCisjZGVmaW5lIFdNODM1MF9SVENfWUhVTkRSRURTX01BU0sgICAgICAgICAgICAgICAweDNGMDAKKyNkZWZpbmUgV004MzUwX1JUQ19ZSFVORFJFRFNfU0hJRlQgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfUlRDX1lVTklUU19NQVNLICAgICAgICAgICAgICAgICAgMHgwMEZGCisjZGVmaW5lIFdNODM1MF9SVENfWVVOSVRTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqIFIyMCAoMHgxNCkgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMKKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1JTlNfTUFTSyAgICAgICAgICAgICAgICAgMHg3RjAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTUlOU19TSElGVCAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TRUNTX01BU0sgICAgICAgICAgICAgICAgIDB4MDA3RgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNFQ1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIyMCAoMHgxNCkgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NSU5TX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNFQ1NfRE9OVF9DQVJFICAgICAgICAgICAgICAgIC0xCisKKy8qCisgKiBSMjEgKDB4MTUpIC0gQWxhcm0gSG91cnMvRGF5CisgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVlfTUFTSyAgICAgICAgICAgICAgICAgIDB4MEYwMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9SVENfQUxNSFBNX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1IUE1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTUhSU19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDFGCisjZGVmaW5lIFdNODM1MF9SVENfQUxNSFJTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogQml0IHZhbHVlcyBmb3IgUjIxICgweDE1KSAqLworI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBWV9ET05UX0NBUkUgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIFdNODM1MF9SVENfQUxNREFZX1NVTiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVlfTU9OICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBWV9UVUUgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFdNODM1MF9SVENfQUxNREFZX1dFRCAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVlfVEhVICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBWV9GUkkgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFdNODM1MF9SVENfQUxNREFZX1NBVCAgICAgICAgICAgICAgICAgICAgICAgIDcKKworI2RlZmluZSBXTTgzNTBfUlRDX0FMTUhQTV9BTSAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNSFBNX1BNICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDX0FMTUhSU19ET05UX0NBUkUgICAgICAgICAgICAgICAgIC0xCisKKy8qCisgKiBSMjIgKDB4MTYpIC0gQWxhcm0gRGF0ZS9Nb250aAorICovCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX01BU0sgICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBVEVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDNGCisjZGVmaW5lIFdNODM1MF9SVENfQUxNREFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAKKworLyogQml0IHZhbHVlcyBmb3IgUjIyICgweDE2KSAqLworI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBVEVfRE9OVF9DQVJFICAgICAgICAgICAgICAgIC0xCisKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9KQU4gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0ZFQiAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfTUFSICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9BUFIgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX01BWSAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfSlVOICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9KVUwgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0FVRyAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfU0VQICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9PQ1QgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX05PViAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfREVDICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9KQU5fQkNEICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0ZFQl9CQ0QgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfTUFSX0JDRCAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9BUFJfQkNEICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX01BWV9CQ0QgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfSlVOX0JDRCAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9KVUxfQkNEICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0FVR19CQ0QgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfU0VQX0JDRCAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9PQ1RfQkNEICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX05PVl9CQ0QgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfREVDX0JDRCAgICAgICAgICAgICAgICAgMHgxMgorCisvKgorICogUjIzICgweDE3KSAtIFJUQyBUaW1lIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX0JDRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9SVENfQkNEX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX1JUQ19CQ0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBXTTgzNTBfUlRDXzEySFIgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9SVENfMTJIUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX1JUQ18xMkhSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfUlRDX0RTVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9SVENfRFNUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX1JUQ19EU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBXTTgzNTBfUlRDX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9SVENfU0VUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX1JUQ19TRVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBXTTgzNTBfUlRDX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9SVENfU1RTX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX1JUQ19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU0VUX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TRVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU1RTX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfUlRDX1BJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDcwCisjZGVmaW5lIFdNODM1MF9SVENfUElOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNzAKKyNkZWZpbmUgV004MzUwX1JUQ19QSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfUlRDX0RTVyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGCisjZGVmaW5lIFdNODM1MF9SVENfRFNXX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBCaXQgdmFsdWVzIGZvciBSMjMgKDB4MTcpICovCisjZGVmaW5lIFdNODM1MF9SVENfQkNEX0JJTkFSWSAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19CQ0RfQkNEICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9SVENfMTJIUl8yNEhSICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ18xMkhSXzEySFIgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9SVENfRFNUX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19EU1RfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9SVENfU0VUX1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19TRVRfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9SVENfU1RTX1JVTk5JTkcgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19TVFNfU1RPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU0VUX1JVTiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TRVRfU0VUICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU1RTX1JVTk5JTkcgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TVFNfU1RPUFBFRCAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9SVENfUElOVF9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19QSU5UX1NFQ1MgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfUlRDX1BJTlRfTUlOUyAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9SVENfUElOVF9IUlMgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX1JUQ19QSU5UX0RBWVMgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfUlRDX1BJTlRfTVRIUyAgICAgICAgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfUlRDX0RTV18xSFogICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9SVENfRFNXXzJIWiAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfNEhaICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfUlRDX0RTV184SFogICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9SVENfRFNXXzE2SFogICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfMzJIWiAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfUlRDX0RTV182NEhaICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFdNODM1MF9SVENfRFNXXzEyOEhaICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfMjU2SFogICAgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBXTTgzNTBfUlRDX0RTV181MTJIWiAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdNODM1MF9SVENfRFNXXzEwMjRIWiAgICAgICAgICAgICAgICAgICAgICAgMTEKKworLyoKKyAqIFIyMTggKDB4REEpIC0gUlRDIFRpY2sgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9SVENfVElDS1NUUyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX1JUQ19DTEtTUkMgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfUlRDX1RSSU1fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwM0ZGCisKKy8qCisgKiBSVEMgSW50ZXJydXB0cy4KKyAqLworI2RlZmluZSBXTTgzNTBfSVJRX1JUQ19QRVIJCQk3CisjZGVmaW5lIFdNODM1MF9JUlFfUlRDX1NFQwkJCTgKKyNkZWZpbmUgV004MzUwX0lSUV9SVENfQUxNCQkJOQorCitzdHJ1Y3Qgd204MzUwX3J0YyB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3N1cHBseS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3N1cHBseS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOGYzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvc3VwcGx5LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBzdXBwbHkuaCAgLS0gIFBvd2VyIFN1cHBseSBEcml2ZXIgZm9yIFdvbGZzb24gV004MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfV004MzUwX1NVUFBMWV9IXworI2RlZmluZSBfX0xJTlVYX01GRF9XTTgzNTBfU1VQUExZX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworLyoKKyAqIENoYXJnZXIgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzEgICAgICAgIDB4QTgKKyNkZWZpbmUgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzIgICAgICAgIDB4QTkKKyNkZWZpbmUgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzMgICAgICAgIDB4QUEKKworLyoKKyAqIFIxNjggKDB4QTgpIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODM1MF9DSEdfRU5BX1IxNjggICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0NIR19USFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX0VPQ19TRUxfTUFTSyAgICAgICAgICAgICAgICAgMHgxQzAwCisjZGVmaW5lIFdNODM1MF9DSEdfVFJJQ0tMRV9URU1QX0NIT0tFICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0NIR19UUklDS0xFX1VTQl9DSE9LRSAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQ0hHX1JFQ09WRVJfVCAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9DSEdfRU5EX0FDVCAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0NIR19GQVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQ0hHX0ZBU1RfVVNCX1RIUk9UVExFICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9DSEdfTlRDX01PTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0NIR19CQVRUX0hPVF9NT04gICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfQ0hHX0JBVFRfQ09MRF9NT04gICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9DSEdfQ0hJUF9URU1QX01PTiAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxNjkgKDB4QTkpIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNODM1MF9DSEdfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0NIR19QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX1NUU19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIFdNODM1MF9DSEdfVElNRV9NQVNLICAgICAgICAgICAgICAgICAgICAweDBGMDAKKyNkZWZpbmUgV004MzUwX0NIR19NQVNLX1dBTExfRkIgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfQ0hHX1RSSUNLTEVfU0VMICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9DSEdfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0NIR19JU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorI2RlZmluZSBXTTgzNTBfQ0hHX1NUU19PRkYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFdNODM1MF9DSEdfU1RTX1RSSUNLTEUgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0NIR19TVFNfRkFTVCAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorCisvKgorICogUjE3MCAoMHhBQSkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAzCisgKi8KKyNkZWZpbmUgV004MzUwX0NIR19USFJPVFRMRV9UX01BU0sgICAgICAgICAgICAgIDB4MDA2MAorI2RlZmluZSBXTTgzNTBfQ0hHX1NNQVJUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9DSEdfVElNRVJfQURKVF9NQVNLICAgICAgICAgICAgICAweDAwMEYKKworLyoKKyAqIENoYXJnZXIgSW50ZXJydXB0cworICovCisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1QJCQkwCisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xECQkJMQorI2RlZmluZSBXTTgzNTBfSVJRX0NIR19CQVRfRkFJTAkJCTIKKyNkZWZpbmUgV004MzUwX0lSUV9DSEdfVE8JCQkzCisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX0VORAkJCTQKKyNkZWZpbmUgV004MzUwX0lSUV9DSEdfU1RBUlQJCQk1CisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX0ZBU1RfUkRZCQkJNgorI2RlZmluZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDkJCTEwCisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMQkJMTEKKyNkZWZpbmUgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NQkJMTIKKworLyoKKyAqIENoYXJnZXIgUG9saWN5CisgKi8KKyNkZWZpbmUgV004MzUwX0NIR19UUklDS0xFXzUwbUEJCQkoMCA8PCA2KQorI2RlZmluZSBXTTgzNTBfQ0hHX1RSSUNLTEVfMTAwbUEJCSgxIDw8IDYpCisjZGVmaW5lIFdNODM1MF9DSEdfNF8wNVYJCQkoMCA8PCA0KQorI2RlZmluZSBXTTgzNTBfQ0hHXzRfMTBWCQkJKDEgPDwgNCkKKyNkZWZpbmUgV004MzUwX0NIR180XzE1VgkJCSgyIDw8IDQpCisjZGVmaW5lIFdNODM1MF9DSEdfNF8yMFYJCQkoMyA8PCA0KQorI2RlZmluZSBXTTgzNTBfQ0hHX0ZBU1RfTElNSVRfbUEoeCkJCSgoeCAvIDUwKSAmIDB4ZikKKyNkZWZpbmUgV004MzUwX0NIR19FT0NfbUEoeCkJCQkoKCh4IC0gMTApICYgMHg3KSA8PCAxMCkKKyNkZWZpbmUgV004MzUwX0NIR19UUklDS0xFXzNfMVYJCQkoMCA8PCAxMykKKyNkZWZpbmUgV004MzUwX0NIR19UUklDS0xFXzNfOVYJCQkoMSA8PCAxMykKKworLyoKKyAqIFN1cHBseSBSZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgV004MzUwX1VTQl9WT0xUQUdFX1JFQURCQUNLICAgICAgICAgICAgIDB4OUMKKyNkZWZpbmUgV004MzUwX0xJTkVfVk9MVEFHRV9SRUFEQkFDSyAgICAgICAgICAgIDB4OUQKKyNkZWZpbmUgV004MzUwX0JBVFRfVk9MVEFHRV9SRUFEQkFDSyAgICAgICAgICAgIDB4OUUKKworLyoKKyAqIFN1cHBseSBJbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIFdNODM1MF9JUlFfVVNCX0xJTUlUCQkJMTUKKyNkZWZpbmUgV004MzUwX0lSUV9FWFRfVVNCX0ZCCQkJMzYKKyNkZWZpbmUgV004MzUwX0lSUV9FWFRfV0FMTF9GQgkJCTM3CisjZGVmaW5lIFdNODM1MF9JUlFfRVhUX0JBVF9GQgkJCTM4CisKK3N0cnVjdCB3bTgzNTBfcG93ZXIgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC93ZHQuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC93ZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjEzNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3dkdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiB3ZHQuaCAgLS0gIFdhdGNoZG9nIERyaXZlciBmb3IgV29sZnNvbiBXTTgzNTAgUE1JQworICoKKyAqIENvcHlyaWdodCAyMDA3LCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODM1MF9XRFRfSF8KKyNkZWZpbmUgX19MSU5VWF9NRkRfV004MzUwX1dEVF9IXworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgV004MzUwX1dET0dfSElCX01PREUgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfV0RPR19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9XRE9HX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX1dET0dfVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNworCisjZGVmaW5lIFdNODM1MF9JUlFfU1lTX1dET0dfVE8JCQkyNAorCitzdHJ1Y3Qgd204MzUwX3dkdCB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLWF1ZGlvLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTg0MDAtYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY0MGUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLWF1ZGlvLmgKQEAgLTAsMCArMSwxMTg2IEBACisvKgorICogd204NDAwIHByaXZhdGUgZGVmaW5pdGlvbnMgZm9yIGF1ZGlvCisgKgorICogQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfV004NDAwX0FVRElPX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfV004NDAwX0FVRElPX0gKKworI2luY2x1ZGUgPGxpbnV4L21mZC93bTg0MDAtYXVkaW8uaD4KKworLyoKKyAqIFIyICgweDAyKSAtIFBvd2VyIE1hbmFnZW1lbnQgKDEpCisgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQ09ERUNfRU5BICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIENPREVDX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBDT0RFQ19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ09ERUNfRU5BICovCisjZGVmaW5lIFdNODQwMF9TWVNDTEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFNZU0NMS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NZU0NMS19FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogU1lTQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfU1lTQ0xLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBTWVNDTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9TWVNDTEtfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNZU0NMS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQS19NSVhfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogU1BLX01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQS19NSVhfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogU1BLX01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQS19NSVhfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAxMyAgLyogU1BLX01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQS19NSVhfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLX01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQS19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogU1BLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfU1BLX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBTUEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9TUEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIFNQS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUM19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQzX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUM19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQzX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUM19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQzX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUM19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBPVVQ0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUNF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBPVVQ0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUNF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBPVVQ0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1VUNF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9VVF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBMT1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9VVF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBMT1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9VVF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBMT1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9VVF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9VVF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBST1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9VVF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBST1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9VVF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBST1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9VVF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1VUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMUJJQVNfRU5BICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBNSUMxQklBU19FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFCSUFTX0VOQV9NQVNLICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTUlDMUJJQVNfRU5BICovCisjZGVmaW5lIFdNODQwMF9NSUMxQklBU19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDQgIC8qIE1JQzFCSUFTX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMUJJQVNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUMxQklBU19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1ZNSURfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNiAgLyogVk1JRF9NT0RFIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004NDAwX1ZNSURfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVk1JRF9NT0RFIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004NDAwX1ZNSURfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogVk1JRF9NT0RFIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004NDAwX1ZSRUZfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVlJFRl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1ZSRUZfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVlJFRl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1ZSRUZfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogVlJFRl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1ZSRUZfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVlJFRl9FTkEgKi8KKworLyoKKyAqIFIzICgweDAzKSAtIFBvd2VyIE1hbmFnZW1lbnQgKDIpCisgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogRkxMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBGTExfRU5BICovCisjZGVmaW5lIFdNODQwMF9GTExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIEZMTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfVFNIVVRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBUU0hVVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RTSFVUX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogVFNIVVRfRU5BICovCisjZGVmaW5lIFdNODQwMF9UU0hVVF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIFRTSFVUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfVFNIVVRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBUU0hVVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RTSFVUX09QRElTICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogVFNIVVRfT1BESVMgKi8KKyNkZWZpbmUgV004NDAwX1RTSFVUX09QRElTX01BU0sgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogVFNIVVRfT1BESVMgKi8KKyNkZWZpbmUgV004NDAwX1RTSFVUX09QRElTX1NISUZUICAgICAgICAgICAgICAgICAgICAxMyAgLyogVFNIVVRfT1BESVMgKi8KKyNkZWZpbmUgV004NDAwX1RTSFVUX09QRElTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogVFNIVVRfT1BESVMgKi8KKyNkZWZpbmUgV004NDAwX09QQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1BDTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9PUENMS19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9QQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1BDTEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDExICAvKiBPUENMS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX09QQ0xLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1BDTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5MX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEFJTkxfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5MX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEFJTkxfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5MX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIEFJTkxfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5MX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJTkxfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5SX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFJTlJfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5SX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFJTlJfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5SX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFJTlJfRU5BICovCisjZGVmaW5lIFdNODQwMF9BSU5SX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJTlJfRU5BICovCisjZGVmaW5lIFdNODQwMF9MSU4zNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJTjM0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTElOMzRfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU4zNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xJTjM0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTElOMzRfRU5BICovCisjZGVmaW5lIFdNODQwMF9MSU4zNF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJTjM0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTElOMTJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMSU4xMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xJTjEyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTElOMTJfRU5BICovCisjZGVmaW5lIFdNODQwMF9MSU4xMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIExJTjEyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTElOMTJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSU4xMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JJTjM0X0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogUklOMzRfRU5BICovCisjZGVmaW5lIFdNODQwMF9SSU4zNF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFJJTjM0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfUklOMzRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBSSU4zNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JJTjM0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUklOMzRfRU5BICovCisjZGVmaW5lIFdNODQwMF9SSU4xMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFJJTjEyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUklOMTJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSSU4xMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JJTjEyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUklOMTJfRU5BICovCisjZGVmaW5lIFdNODQwMF9SSU4xMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJTjEyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENSX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENSX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENSX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENSX0VOQSAqLworCisvKgorICogUjQgKDB4MDQpIC0gUG93ZXIgTWFuYWdlbWVudCAoMykKKyAqLworI2RlZmluZSBXTTg0MDBfTE9OX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBMT05fRU5BICovCisjZGVmaW5lIFdNODQwMF9MT05fRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIExPTl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPTl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogTE9OX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9OX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT05fRU5BICovCisjZGVmaW5lIFdNODQwMF9MT1BfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIExPUF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPUF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogTE9QX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9QX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBMT1BfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT1BfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPUF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPTl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogUk9OX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9OX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBST05fRU5BICovCisjZGVmaW5lIFdNODQwMF9ST05fRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIFJPTl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPTl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9OX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9QX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBST1BfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST1BfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIFJPUF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPUF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogUk9QX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9QX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1BfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT1BHQV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPUEdBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMT1BHQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE9QR0FfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT1BHQV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPUEdBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBST1BHQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUk9QR0FfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST1BHQV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJPUEdBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1BHQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPTUlYX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTE9NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT01JWF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExPTUlYX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9NSVhfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMT01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPTUlYX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST01JWF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFJPTUlYX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9NSVhfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBST01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPTUlYX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUk9NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST01JWF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPTUlYX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEQUNMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEQUNMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEQUNSX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEQUNSX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQUNSX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREFDUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNSX0VOQSAqLworCisvKgorICogUjUgKDB4MDUpIC0gQXVkaW8gSW50ZXJmYWNlICgxKQorICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENMX1NSQyAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEFJRkFEQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENMX1NSQ19NQVNLICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEFJRkFEQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENMX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgMTUgIC8qIEFJRkFEQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENMX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRkFEQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENSX1NSQyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEFJRkFEQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENSX1NSQ19NQVNLICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEFJRkFEQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENSX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgMTQgIC8qIEFJRkFEQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENSX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRkFEQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENfVERNICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRkFEQ19URE0gKi8KKyNkZWZpbmUgV004NDAwX0FJRkFEQ19URE1fTUFTSyAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGQURDX1RETSAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDX1RETV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUZBRENfVERNICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENfVERNX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRkFEQ19URE0gKi8KKyNkZWZpbmUgV004NDAwX0FJRkFEQ19URE1fQ0hBTiAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogQUlGQURDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENfVERNX0NIQU5fTUFTSyAgICAgICAgICAgICAweDEwMDAgIC8qIEFJRkFEQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDX1RETV9DSEFOX1NISUZUICAgICAgICAgICAgICAgIDEyICAvKiBBSUZBRENfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004NDAwX0FJRkFEQ19URE1fQ0hBTl9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQUlGQURDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODQwMF9BSUZfQkNMS19JTlYgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFJRl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfQUlGX0JDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBSUZfQkNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9CQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgOCAgLyogQUlGX0JDTEtfSU5WICovCisjZGVmaW5lIFdNODQwMF9BSUZfQkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfQUlGX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUZfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNODQwMF9BSUZfTFJDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRl9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogQUlGX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfQUlGX0xSQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNODQwMF9BSUZfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIEFJRl9XTCAtIFs2OjVdICovCisjZGVmaW5lIFdNODQwMF9BSUZfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRl9XTCAtIFs2OjVdICovCisjZGVmaW5lIFdNODQwMF9BSUZfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRl9XTCAtIFs2OjVdICovCisjZGVmaW5lIFdNODQwMF9BSUZfV0xfMTZCSVRTCQkJKDAgPDwgNSkKKyNkZWZpbmUgV004NDAwX0FJRl9XTF8yMEJJVFMJCQkoMSA8PCA1KQorI2RlZmluZSBXTTg0MDBfQUlGX1dMXzI0QklUUwkJCSgyIDw8IDUpCisjZGVmaW5lIFdNODQwMF9BSUZfV0xfMzJCSVRTCQkJKDMgPDwgNSkKKyNkZWZpbmUgV004NDAwX0FJRl9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAxOCAgLyogQUlGX0ZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODQwMF9BSUZfRk1UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRl9GTVQgLSBbNDozXSAqLworI2RlZmluZSBXTTg0MDBfQUlGX0ZNVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSUZfRk1UIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004NDAwX0FJRl9GTVRfUklHSFRKCQkJKDAgPDwgMykKKyNkZWZpbmUgV004NDAwX0FJRl9GTVRfTEVGVEoJCQkoMSA8PCAzKQorI2RlZmluZSBXTTg0MDBfQUlGX0ZNVF9JMlMJCQkoMiA8PCAzKQorI2RlZmluZSBXTTg0MDBfQUlGX0ZNVF9EU1AJCQkoMyA8PCAzKQorCisvKgorICogUjYgKDB4MDYpIC0gQXVkaW8gSW50ZXJmYWNlICgyKQorICovCisjZGVmaW5lIFdNODQwMF9EQUNMX1NSQyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIERBQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9EQUNMX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIERBQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9EQUNMX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIERBQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9EQUNMX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ0xfU1JDICovCisjZGVmaW5lIFdNODQwMF9EQUNSX1NSQyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIERBQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9EQUNSX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIERBQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9EQUNSX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIERBQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9EQUNSX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ1JfU1JDICovCisjZGVmaW5lIFdNODQwMF9BSUZEQUNfVERNICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRkRBQ19URE0gKi8KKyNkZWZpbmUgV004NDAwX0FJRkRBQ19URE1fTUFTSyAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGREFDX1RETSAqLworI2RlZmluZSBXTTg0MDBfQUlGREFDX1RETV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUZEQUNfVERNICovCisjZGVmaW5lIFdNODQwMF9BSUZEQUNfVERNX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRkRBQ19URE0gKi8KKyNkZWZpbmUgV004NDAwX0FJRkRBQ19URE1fQ0hBTiAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogQUlGREFDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODQwMF9BSUZEQUNfVERNX0NIQU5fTUFTSyAgICAgICAgICAgICAweDEwMDAgIC8qIEFJRkRBQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg0MDBfQUlGREFDX1RETV9DSEFOX1NISUZUICAgICAgICAgICAgICAgIDEyICAvKiBBSUZEQUNfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004NDAwX0FJRkRBQ19URE1fQ0hBTl9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQUlGREFDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODQwMF9EQUNfQk9PU1RfTUFTSyAgICAgICAgICAgICAgICAgICAweDBDMDAgIC8qIERBQ19CT09TVCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ19CT09TVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogREFDX0JPT1NUIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg0MDBfREFDX0JPT1NUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBEQUNfQk9PU1QgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ09NUF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ09NUE1PREUgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREFDX0NPTVBNT0RFX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19DT01QTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogREFDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ09NUE1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg0MDBfQURDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBRENfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfQURDX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBRENfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfQURDX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBRENfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfQURDX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfQURDX0NPTVBNT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DT01QTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODQwMF9BRENfQ09NUE1PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg0MDBfQURDX0NPTVBNT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BCQUNLX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BCQUNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BCQUNLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9PUEJBQ0sgKi8KKworLyoKKyAqIFI3ICgweDA3KSAtIENsb2NraW5nICgxKQorICovCisjZGVmaW5lIFdNODQwMF9UT0NMS19SQVRFICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFRPQ0xLX1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX1RPQ0xLX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogVE9DTEtfUkFURSAqLworI2RlZmluZSBXTTg0MDBfVE9DTEtfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBUT0NMS19SQVRFICovCisjZGVmaW5lIFdNODQwMF9UT0NMS19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRPQ0xLX1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX1RPQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogVE9DTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9UT0NMS19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFRPQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfVE9DTEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBUT0NMS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RPQ0xLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVE9DTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9PUENMS0RJVl9NQVNLICAgICAgICAgICAgICAgICAgICAweDFFMDAgIC8qIE9QQ0xLRElWIC0gWzEyOjldICovCisjZGVmaW5lIFdNODQwMF9PUENMS0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9QQ0xLRElWIC0gWzEyOjldICovCisjZGVmaW5lIFdNODQwMF9PUENMS0RJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIE9QQ0xLRElWIC0gWzEyOjldICovCisjZGVmaW5lIFdNODQwMF9EQ0xLRElWX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIERDTEtESVYgLSBbODo2XSAqLworI2RlZmluZSBXTTg0MDBfRENMS0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBEQ0xLRElWIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0RDTEtESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogRENMS0RJViAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9CQ0xLX0RJVl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMUUgIC8qIEJDTEtfRElWIC0gWzQ6MV0gKi8KKyNkZWZpbmUgV004NDAwX0JDTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQkNMS19ESVYgLSBbNDoxXSAqLworI2RlZmluZSBXTTg0MDBfQkNMS19ESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBCQ0xLX0RJViAtIFs0OjFdICovCisKKy8qCisgKiBSOCAoMHgwOCkgLSBDbG9ja2luZyAoMikKKyAqLworI2RlZmluZSBXTTg0MDBfTUNMS19TUkMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBNQ0xLX1NSQyAqLworI2RlZmluZSBXTTg0MDBfTUNMS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBNQ0xLX1NSQyAqLworI2RlZmluZSBXTTg0MDBfTUNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBNQ0xLX1NSQyAqLworI2RlZmluZSBXTTg0MDBfTUNMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQ0xLX1NSQyAqLworI2RlZmluZSBXTTg0MDBfU1lTQ0xLX1NSQyAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBTWVNDTEtfU1JDICovCisjZGVmaW5lIFdNODQwMF9TWVNDTEtfU1JDX01BU0sgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFNZU0NMS19TUkMgKi8KKyNkZWZpbmUgV004NDAwX1NZU0NMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNCAgLyogU1lTQ0xLX1NSQyAqLworI2RlZmluZSBXTTg0MDBfU1lTQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTWVNDTEtfU1JDICovCisjZGVmaW5lIFdNODQwMF9DTEtfRk9SQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIENMS19GT1JDRSAqLworI2RlZmluZSBXTTg0MDBfQ0xLX0ZPUkNFX01BU0sgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBDTEtfRk9SQ0UgKi8KKyNkZWZpbmUgV004NDAwX0NMS19GT1JDRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogQ0xLX0ZPUkNFICovCisjZGVmaW5lIFdNODQwMF9DTEtfRk9SQ0VfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENMS19GT1JDRSAqLworI2RlZmluZSBXTTg0MDBfTUNMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxODAwICAvKiBNQ0xLX0RJViAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV004NDAwX01DTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogTUNMS19ESVYgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNODQwMF9NQ0xLX0RJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE1DTEtfRElWIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTg0MDBfTUNMS19JTlYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBNQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfTUNMS19JTlZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBNQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfTUNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBNQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfTUNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfQURDX0NMS0RJVl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMEUwICAvKiBBRENfQ0xLRElWIC0gWzc6NV0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DTEtESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogQURDX0NMS0RJViAtIFs3OjVdICovCisjZGVmaW5lIFdNODQwMF9BRENfQ0xLRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFEQ19DTEtESVYgLSBbNzo1XSAqLworI2RlZmluZSBXTTg0MDBfREFDX0NMS0RJVl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDFDICAvKiBEQUNfQ0xLRElWIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ19DTEtESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogREFDX0NMS0RJViAtIFs0OjJdICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ0xLRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERBQ19DTEtESVYgLSBbNDoyXSAqLworCisvKgorICogUjkgKDB4MDkpIC0gQXVkaW8gSW50ZXJmYWNlICgzKQorICovCisjZGVmaW5lIFdNODQwMF9BSUZfTVNUUjEgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEFJRl9NU1RSMSAqLworI2RlZmluZSBXTTg0MDBfQUlGX01TVFIxX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBBSUZfTVNUUjEgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9NU1RSMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogQUlGX01TVFIxICovCisjZGVmaW5lIFdNODQwMF9BSUZfTVNUUjFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRl9NU1RSMSAqLworI2RlZmluZSBXTTg0MDBfQUlGX01TVFIyICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBBSUZfTVNUUjIgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9NU1RSMl9NQVNLICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogQUlGX01TVFIyICovCisjZGVmaW5lIFdNODQwMF9BSUZfTVNUUjJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIEFJRl9NU1RSMiAqLworI2RlZmluZSBXTTg0MDBfQUlGX01TVFIyX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZfTVNUUjIgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGX1NFTCAqLworI2RlZmluZSBXTTg0MDBfQUlGX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBSUZfU0VMICovCisjZGVmaW5lIFdNODQwMF9BSUZfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFJRl9TRUwgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGX1NFTCAqLworI2RlZmluZSBXTTg0MDBfQURDTFJDX0RJUiAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBRENMUkNfRElSICovCisjZGVmaW5lIFdNODQwMF9BRENMUkNfRElSX01BU0sgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIEFEQ0xSQ19ESVIgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xSQ19ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMSAgLyogQURDTFJDX0RJUiAqLworI2RlZmluZSBXTTg0MDBfQURDTFJDX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENMUkNfRElSICovCisjZGVmaW5lIFdNODQwMF9BRENMUkNfUkFURV9NQVNLICAgICAgICAgICAgICAgICAweDA3RkYgIC8qIEFEQ0xSQ19SQVRFIC0gWzEwOjBdICovCisjZGVmaW5lIFdNODQwMF9BRENMUkNfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFEQ0xSQ19SQVRFIC0gWzEwOjBdICovCisjZGVmaW5lIFdNODQwMF9BRENMUkNfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgMTEgIC8qIEFEQ0xSQ19SQVRFIC0gWzEwOjBdICovCisKKy8qCisgKiBSMTAgKDB4MEEpIC0gQXVkaW8gSW50ZXJmYWNlICg0KQorICovCisjZGVmaW5lIFdNODQwMF9BTFJDR1BJTzEgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEFMUkNHUElPMSAqLworI2RlZmluZSBXTTg0MDBfQUxSQ0dQSU8xX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBBTFJDR1BJTzEgKi8KKyNkZWZpbmUgV004NDAwX0FMUkNHUElPMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogQUxSQ0dQSU8xICovCisjZGVmaW5lIFdNODQwMF9BTFJDR1BJTzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFMUkNHUElPMSAqLworI2RlZmluZSBXTTg0MDBfQUxSQ0JHUElPNiAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBBTFJDQkdQSU82ICovCisjZGVmaW5lIFdNODQwMF9BTFJDQkdQSU82X01BU0sgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEFMUkNCR1BJTzYgKi8KKyNkZWZpbmUgV004NDAwX0FMUkNCR1BJTzZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNCAgLyogQUxSQ0JHUElPNiAqLworI2RlZmluZSBXTTg0MDBfQUxSQ0JHUElPNl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBTFJDQkdQSU82ICovCisjZGVmaW5lIFdNODQwMF9BSUZfVFJJUyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRl9UUklTICovCisjZGVmaW5lIFdNODQwMF9BSUZfVFJJU19NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRl9UUklTICovCisjZGVmaW5lIFdNODQwMF9BSUZfVFJJU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFJRl9UUklTICovCisjZGVmaW5lIFdNODQwMF9BSUZfVFJJU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRl9UUklTICovCisjZGVmaW5lIFdNODQwMF9EQUNMUkNfRElSICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIERBQ0xSQ19ESVIgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xSQ19ESVJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREFDTFJDX0RJUiAqLworI2RlZmluZSBXTTg0MDBfREFDTFJDX0RJUl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDExICAvKiBEQUNMUkNfRElSICovCisjZGVmaW5lIFdNODQwMF9EQUNMUkNfRElSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ0xSQ19ESVIgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xSQ19SQVRFX01BU0sgICAgICAgICAgICAgICAgIDB4MDdGRiAgLyogREFDTFJDX1JBVEUgLSBbMTA6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xSQ19SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogREFDTFJDX1JBVEUgLSBbMTA6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xSQ19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxMSAgLyogREFDTFJDX1JBVEUgLSBbMTA6MF0gKi8KKworLyoKKyAqIFIxMSAoMHgwQikgLSBEQUMgQ1RSTAorICovCisjZGVmaW5lIFdNODQwMF9EQUNfU0RNQ0xLX1JBVEUgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIERBQ19TRE1DTEtfUkFURSAqLworI2RlZmluZSBXTTg0MDBfREFDX1NETUNMS19SQVRFX01BU0sgICAgICAgICAgICAgMHgyMDAwICAvKiBEQUNfU0RNQ0xLX1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19TRE1DTEtfUkFURV9TSElGVCAgICAgICAgICAgICAgICAxMyAgLyogREFDX1NETUNMS19SQVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfU0RNQ0xLX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIERBQ19TRE1DTEtfUkFURSAqLworI2RlZmluZSBXTTg0MDBfQUlGX0xSQ0xLUkFURSAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBBSUZfTFJDTEtSQVRFICovCisjZGVmaW5lIFdNODQwMF9BSUZfTFJDTEtSQVRFX01BU0sgICAgICAgICAgICAgICAweDA0MDAgIC8qIEFJRl9MUkNMS1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9MUkNMS1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAxMCAgLyogQUlGX0xSQ0xLUkFURSAqLworI2RlZmluZSBXTTg0MDBfQUlGX0xSQ0xLUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZfTFJDTEtSQVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTU9OTyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIERBQ19NT05PICovCisjZGVmaW5lIFdNODQwMF9EQUNfTU9OT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIERBQ19NT05PICovCisjZGVmaW5lIFdNODQwMF9EQUNfTU9OT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIERBQ19NT05PICovCisjZGVmaW5lIFdNODQwMF9EQUNfTU9OT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19NT05PICovCisjZGVmaW5lIFdNODQwMF9EQUNfU0JfRklMVCAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIERBQ19TQl9GSUxUICovCisjZGVmaW5lIFdNODQwMF9EQUNfU0JfRklMVF9NQVNLICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIERBQ19TQl9GSUxUICovCisjZGVmaW5lIFdNODQwMF9EQUNfU0JfRklMVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ19TQl9GSUxUICovCisjZGVmaW5lIFdNODQwMF9EQUNfU0JfRklMVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19TQl9GSUxUICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURVJBVEUgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIERBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg0MDBfREFDX01VVEVSQVRFX01BU0sgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQUNfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgNyAgLyogREFDX01VVEVSQVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURVJBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg0MDBfREFDX01VVEVNT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBEQUNfTVVURU1PREUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogREFDX01VVEVNT0RFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURU1PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDYgIC8qIERBQ19NVVRFTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREFDX01VVEVNT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfTVVURU1PREUgKi8KKyNkZWZpbmUgV004NDAwX0RFRU1QX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMCAgLyogREVFTVAgLSBbNTo0XSAqLworI2RlZmluZSBXTTg0MDBfREVFTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBERUVNUCAtIFs1OjRdICovCisjZGVmaW5lIFdNODQwMF9ERUVNUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERFRU1QIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogREFDX01VVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogREFDX01VVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogREFDX01VVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDX01VVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfREFUSU5WICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfREFUSU5WX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfREFUSU5WX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfREFUSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfREFUSU5WICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDUl9EQVRJTlYgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfREFUSU5WX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDUl9EQVRJTlYgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfREFUSU5WX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogREFDUl9EQVRJTlYgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfREFUSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDUl9EQVRJTlYgKi8KKworLyoKKyAqIFIxMiAoMHgwQykgLSBMZWZ0IERBQyBEaWdpdGFsIFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9EQUNfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIERBQ19WVSAqLworI2RlZmluZSBXTTg0MDBfREFDX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNfVlUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogREFDX1ZVICovCisjZGVmaW5lIFdNODQwMF9EQUNfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19WVSAqLworI2RlZmluZSBXTTg0MDBfREFDTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEQUNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9EQUNMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERBQ0xfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogREFDTF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEzICgweDBEKSAtIFJpZ2h0IERBQyBEaWdpdGFsIFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9EQUNfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIERBQ19WVSAqLworI2RlZmluZSBXTTg0MDBfREFDX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNfVlUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogREFDX1ZVICovCisjZGVmaW5lIFdNODQwMF9EQUNfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19WVSAqLworI2RlZmluZSBXTTg0MDBfREFDUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEQUNSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9EQUNSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERBQ1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogREFDUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjE0ICgweDBFKSAtIERpZ2l0YWwgU2lkZSBUb25lCisgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfREFDX1NWT0xfTUFTSyAgICAgICAgICAgICAgIDB4MUUwMCAgLyogICBBRENMX0RBQ19TVk9MIC0gWzEyOjldICovCisjZGVmaW5lIFdNODQwMF9BRENMX0RBQ19TVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDkgIC8qICAgQURDTF9EQUNfU1ZPTCAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9EQUNfU1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA0ICAvKiAgIEFEQ0xfREFDX1NWT0wgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfREFDX1NWT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDFFMCAgLyogQURDUl9EQUNfU1ZPTCAtIFs4OjVdICovCisjZGVmaW5lIFdNODQwMF9BRENSX0RBQ19TVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDUgIC8qIEFEQ1JfREFDX1NWT0wgLSBbODo1XSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9EQUNfU1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA0ICAvKiBBRENSX0RBQ19TVk9MIC0gWzg6NV0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ19UT19EQUNMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwQyAgLyogQURDX1RPX0RBQ0wgLSBbMzoyXSAqLworI2RlZmluZSBXTTg0MDBfQURDX1RPX0RBQ0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyICAvKiBBRENfVE9fREFDTCAtIFszOjJdICovCisjZGVmaW5lIFdNODQwMF9BRENfVE9fREFDTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFEQ19UT19EQUNMIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ19UT19EQUNSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogQURDX1RPX0RBQ1IgLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfQURDX1RPX0RBQ1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENfVE9fREFDUiAtIFsxOjBdICovCisjZGVmaW5lIFdNODQwMF9BRENfVE9fREFDUl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFEQ19UT19EQUNSIC0gWzE6MF0gKi8KKworLyoKKyAqIFIxNSAoMHgwRikgLSBBREMgQ1RSTAorICovCisjZGVmaW5lIFdNODQwMF9BRENfSFBGX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFEQ19IUEZfRU5BICovCisjZGVmaW5lIFdNODQwMF9BRENfSFBGX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFEQ19IUEZfRU5BICovCisjZGVmaW5lIFdNODQwMF9BRENfSFBGX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFEQ19IUEZfRU5BICovCisjZGVmaW5lIFdNODQwMF9BRENfSFBGX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ19IUEZfRU5BICovCisjZGVmaW5lIFdNODQwMF9BRENfSFBGX0NVVF9NQVNLICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIEFEQ19IUEZfQ1VUIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ19IUEZfQ1VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgNSAgLyogQURDX0hQRl9DVVQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg0MDBfQURDX0hQRl9DVVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBBRENfSFBGX0NVVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODQwMF9BRENMX0RBVElOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9BRENMX0RBVElOVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9BRENMX0RBVElOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9BRENMX0RBVElOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9BRENSX0RBVElOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFEQ1JfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9BRENSX0RBVElOVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFEQ1JfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9BRENSX0RBVElOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFEQ1JfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9BRENSX0RBVElOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ1JfREFUSU5WICovCisKKy8qCisgKiBSMTYgKDB4MTApIC0gTGVmdCBBREMgRGlnaXRhbCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfQURDX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENfVlUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDX1ZVICovCisjZGVmaW5lIFdNODQwMF9BRENfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFEQ19WVSAqLworI2RlZmluZSBXTTg0MDBfQURDX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfVlUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogQURDTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9BRENMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFEQ0xfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxNyAoMHgxMSkgLSBSaWdodCBBREMgRGlnaXRhbCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfQURDX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENfVlUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDX1ZVICovCisjZGVmaW5lIFdNODQwMF9BRENfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFEQ19WVSAqLworI2RlZmluZSBXTTg0MDBfQURDX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfVlUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogQURDUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9BRENSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFEQ1JfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNCAoMHgxOCkgLSBMZWZ0IExpbmUgSW5wdXQgMSYyIFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9JUFZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0xJMTJNVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTEkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xJMTJNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTEkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xJMTJNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTEkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xJMTJNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xJMTJaQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTEkxMlpDICovCisjZGVmaW5lIFdNODQwMF9MSTEyWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExJMTJaQyAqLworI2RlZmluZSBXTTg0MDBfTEkxMlpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBMSTEyWkMgKi8KKyNkZWZpbmUgV004NDAwX0xJMTJaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEkxMlpDICovCisjZGVmaW5lIFdNODQwMF9MSU4xMlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIExJTjEyVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xJTjEyVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTElOMTJWT0wgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfTElOMTJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMSU4xMlZPTCAtIFs0OjBdICovCisKKy8qCisgKiBSMjUgKDB4MTkpIC0gTGVmdCBMaW5lIElucHV0IDMmNCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfSVBWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9MSTM0TVVURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJMzRNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTM0TVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJMzRNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTM0TVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExJMzRNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTM0TVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJMzRNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTM0WkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExJMzRaQyAqLworI2RlZmluZSBXTTg0MDBfTEkzNFpDX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMSTM0WkMgKi8KKyNkZWZpbmUgV004NDAwX0xJMzRaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTEkzNFpDICovCisjZGVmaW5lIFdNODQwMF9MSTM0WkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJMzRaQyAqLworI2RlZmluZSBXTTg0MDBfTElOMzRWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBMSU4zNFZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MSU4zNFZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExJTjM0Vk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xJTjM0Vk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTElOMzRWT0wgLSBbNDowXSAqLworCisvKgorICogUjI2ICgweDFBKSAtIFJpZ2h0IExpbmUgSW5wdXQgMSYyIFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9JUFZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX1JJMTJNVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUkkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMTJNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUkkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMTJNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogUkkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMTJNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkkxMk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMTJaQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUkkxMlpDICovCisjZGVmaW5lIFdNODQwMF9SSTEyWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJJMTJaQyAqLworI2RlZmluZSBXTTg0MDBfUkkxMlpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBSSTEyWkMgKi8KKyNkZWZpbmUgV004NDAwX1JJMTJaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkkxMlpDICovCisjZGVmaW5lIFdNODQwMF9SSU4xMlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIFJJTjEyVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JJTjEyVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUklOMTJWT0wgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfUklOMTJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBSSU4xMlZPTCAtIFs0OjBdICovCisKKy8qCisgKiBSMjcgKDB4MUIpIC0gUmlnaHQgTGluZSBJbnB1dCAzJjQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX0lQVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfUkkzNE1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBSSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfUkkzNE1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBSSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfUkkzNE1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBSSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfUkkzNE1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfUkkzNFpDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBSSTM0WkMgKi8KKyNkZWZpbmUgV004NDAwX1JJMzRaQ19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUkkzNFpDICovCisjZGVmaW5lIFdNODQwMF9SSTM0WkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJJMzRaQyAqLworI2RlZmluZSBXTTg0MDBfUkkzNFpDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSSTM0WkMgKi8KKyNkZWZpbmUgV004NDAwX1JJTjM0Vk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogUklOMzRWT0wgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfUklOMzRWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSSU4zNFZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9SSU4zNFZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFJJTjM0Vk9MIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIyOCAoMHgxQykgLSBMZWZ0IE91dHB1dCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfT1BWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9MT1pDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPWkMgKi8KKyNkZWZpbmUgV004NDAwX0xPWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTE9aQyAqLworI2RlZmluZSBXTTg0MDBfTE9aQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBMT1pDICovCisjZGVmaW5lIFdNODQwMF9MT1pDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPWkMgKi8KKyNkZWZpbmUgV004NDAwX0xPVVRWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogTE9VVFZPTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9MT1VUVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExPVVRWT0wgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfTE9VVFZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBMT1VUVk9MIC0gWzY6MF0gKi8KKworLyoKKyAqIFIyOSAoMHgxRCkgLSBSaWdodCBPdXRwdXQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX09QVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfUk9aQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBST1pDICovCisjZGVmaW5lIFdNODQwMF9ST1pDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJPWkMgKi8KKyNkZWZpbmUgV004NDAwX1JPWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogUk9aQyAqLworI2RlZmluZSBXTTg0MDBfUk9aQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1pDICovCisjZGVmaW5lIFdNODQwMF9ST1VUVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwN0YgIC8qIFJPVVRWT0wgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfUk9VVFZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBST1VUVk9MIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JPVVRWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogUk9VVFZPTCAtIFs2OjBdICovCisKKy8qCisgKiBSMzAgKDB4MUUpIC0gTGluZSBPdXRwdXRzIFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9MT05NVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExPTk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xPTk1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTE9OTVVURSAqLworI2RlZmluZSBXTTg0MDBfTE9OTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBMT05NVVRFICovCisjZGVmaW5lIFdNODQwMF9MT05NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPTk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xPUE1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTE9QTVVURSAqLworI2RlZmluZSBXTTg0MDBfTE9QTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMT1BNVVRFICovCisjZGVmaW5lIFdNODQwMF9MT1BNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExPUE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xPUE1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9QTVVURSAqLworI2RlZmluZSBXTTg0MDBfTE9BVFROICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMT0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX0xPQVRUTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTE9BVFROICovCisjZGVmaW5lIFdNODQwMF9MT0FUVE5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExPQVRUTiAqLworI2RlZmluZSBXTTg0MDBfTE9BVFROX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX1JPTk1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUk9OTVVURSAqLworI2RlZmluZSBXTTg0MDBfUk9OTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBST05NVVRFICovCisjZGVmaW5lIFdNODQwMF9ST05NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFJPTk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JPTk1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9OTVVURSAqLworI2RlZmluZSBXTTg0MDBfUk9QTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBST1BNVVRFICovCisjZGVmaW5lIFdNODQwMF9ST1BNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFJPUE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JPUE1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9QTVVURSAqLworI2RlZmluZSBXTTg0MDBfUk9QTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1BNVVRFICovCisjZGVmaW5lIFdNODQwMF9ST0FUVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJPQVRUTiAqLworI2RlZmluZSBXTTg0MDBfUk9BVFROX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBST0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX1JPQVRUTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUk9BVFROICovCisjZGVmaW5lIFdNODQwMF9ST0FUVE5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPQVRUTiAqLworCisvKgorICogUjMxICgweDFGKSAtIE91dDMvNCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfT1VUM01VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBPVVQzTVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUM01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBPVVQzTVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUM01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBPVVQzTVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUM01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzTVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUM0FUVE4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBPVVQzQVRUTiAqLworI2RlZmluZSBXTTg0MDBfT1VUM0FUVE5fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBPVVQzQVRUTiAqLworI2RlZmluZSBXTTg0MDBfT1VUM0FUVE5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBPVVQzQVRUTiAqLworI2RlZmluZSBXTTg0MDBfT1VUM0FUVE5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzQVRUTiAqLworI2RlZmluZSBXTTg0MDBfT1VUNE1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUNE1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUNE1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUNE1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0TVVURSAqLworI2RlZmluZSBXTTg0MDBfT1VUNEFUVE4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBPVVQ0QVRUTiAqLworI2RlZmluZSBXTTg0MDBfT1VUNEFUVE5fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBPVVQ0QVRUTiAqLworI2RlZmluZSBXTTg0MDBfT1VUNEFUVE5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ0QVRUTiAqLworI2RlZmluZSBXTTg0MDBfT1VUNEFUVE5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0QVRUTiAqLworCisvKgorICogUjMyICgweDIwKSAtIExlZnQgT1BHQSBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfT1BWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9MT1BHQVpDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPUEdBWkMgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTE9QR0FaQyAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBMT1BHQVpDICovCisjZGVmaW5lIFdNODQwMF9MT1BHQVpDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPUEdBWkMgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogTE9QR0FWT0wgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMT1BHQVZPTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9MT1BHQVZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExPUEdBVk9MIC0gWzY6MF0gKi8KKworLyoKKyAqIFIzMyAoMHgyMSkgLSBSaWdodCBPUEdBIFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9PUFZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBWkMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUk9QR0FaQyAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FaQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBST1BHQVpDICovCisjZGVmaW5lIFdNODQwMF9ST1BHQVpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFJPUEdBWkMgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9QR0FaQyAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBST1BHQVZPTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9ST1BHQVZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJPUEdBVk9MIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogUk9QR0FWT0wgLSBbNjowXSAqLworCisvKgorICogUjM0ICgweDIyKSAtIFNwZWFrZXIgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX1NQS0FUVE5fTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogU1BLQVRUTiAtIFsxOjBdICovCisjZGVmaW5lIFdNODQwMF9TUEtBVFROX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFNQS0FUVE4gLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfU1BLQVRUTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBTUEtBVFROIC0gWzE6MF0gKi8KKworLyoKKyAqIFIzNSAoMHgyMykgLSBDbGFzc0QxCisgKi8KKyNkZWZpbmUgV004NDAwX0NETU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQ0RNT0RFICovCisjZGVmaW5lIFdNODQwMF9DRE1PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIENETU9ERSAqLworI2RlZmluZSBXTTg0MDBfQ0RNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBDRE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0NETU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0RNT0RFICovCisjZGVmaW5lIFdNODQwMF9DTEFTU0RfQ0xLX1NFTCAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIENMQVNTRF9DTEtfU0VMICovCisjZGVmaW5lIFdNODQwMF9DTEFTU0RfQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAweDAwODAgIC8qIENMQVNTRF9DTEtfU0VMICovCisjZGVmaW5lIFdNODQwMF9DTEFTU0RfQ0xLX1NFTF9TSElGVCAgICAgICAgICAgICAgICAgIDcgIC8qIENMQVNTRF9DTEtfU0VMICovCisjZGVmaW5lIFdNODQwMF9DTEFTU0RfQ0xLX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIENMQVNTRF9DTEtfU0VMICovCisjZGVmaW5lIFdNODQwMF9DRF9TUkNUUkwgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIENEX1NSQ1RSTCAqLworI2RlZmluZSBXTTg0MDBfQ0RfU1JDVFJMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBDRF9TUkNUUkwgKi8KKyNkZWZpbmUgV004NDAwX0NEX1NSQ1RSTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQ0RfU1JDVFJMICovCisjZGVmaW5lIFdNODQwMF9DRF9TUkNUUkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENEX1NSQ1RSTCAqLworI2RlZmluZSBXTTg0MDBfU1BLTk9QT1AgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBTUEtOT1BPUCAqLworI2RlZmluZSBXTTg0MDBfU1BLTk9QT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBTUEtOT1BPUCAqLworI2RlZmluZSBXTTg0MDBfU1BLTk9QT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBTUEtOT1BPUCAqLworI2RlZmluZSBXTTg0MDBfU1BLTk9QT1BfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEtOT1BPUCAqLworI2RlZmluZSBXTTg0MDBfREJMRVJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEQkxFUkFURSAqLworI2RlZmluZSBXTTg0MDBfREJMRVJBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEQkxFUkFURSAqLworI2RlZmluZSBXTTg0MDBfREJMRVJBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBEQkxFUkFURSAqLworI2RlZmluZSBXTTg0MDBfREJMRVJBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQkxFUkFURSAqLworI2RlZmluZSBXTTg0MDBfTE9PUFRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBMT09QVEVTVCAqLworI2RlZmluZSBXTTg0MDBfTE9PUFRFU1RfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBMT09QVEVTVCAqLworI2RlZmluZSBXTTg0MDBfTE9PUFRFU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMT09QVEVTVCAqLworI2RlZmluZSBXTTg0MDBfTE9PUFRFU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT09QVEVTVCAqLworI2RlZmluZSBXTTg0MDBfSEFMRkFCQklBUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBIQUxGQUJCSUFTICovCisjZGVmaW5lIFdNODQwMF9IQUxGQUJCSUFTX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEhBTEZBQkJJQVMgKi8KKyNkZWZpbmUgV004NDAwX0hBTEZBQkJJQVNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSEFMRkFCQklBUyAqLworI2RlZmluZSBXTTg0MDBfSEFMRkFCQklBU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIQUxGQUJCSUFTICovCisjZGVmaW5lIFdNODQwMF9UUklERUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIFRSSURFTCAtIFsxOjBdICovCisjZGVmaW5lIFdNODQwMF9UUklERUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFRSSURFTCAtIFsxOjBdICovCisjZGVmaW5lIFdNODQwMF9UUklERUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFRSSURFTCAtIFsxOjBdICovCisKKy8qCisgKiBSMzcgKDB4MjUpIC0gQ2xhc3NEMworICovCisjZGVmaW5lIFdNODQwMF9EQ0dBSU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIERDR0FJTiAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9EQ0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERDR0FJTiAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9EQ0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERDR0FJTiAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9BQ0dBSU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEFDR0FJTiAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9BQ0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFDR0FJTiAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9BQ0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFDR0FJTiAtIFsyOjBdICovCisKKy8qCisgKiBSMzkgKDB4MjcpIC0gSW5wdXQgTWl4ZXIxCisgKi8KKyNkZWZpbmUgV004NDAwX0FJTkxNT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwQyAgLyogQUlOTE1PREUgLSBbMzoyXSAqLworI2RlZmluZSBXTTg0MDBfQUlOTE1PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSU5MTU9ERSAtIFszOjJdICovCisjZGVmaW5lIFdNODQwMF9BSU5MTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJTkxNT0RFIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004NDAwX0FJTlJNT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogQUlOUk1PREUgLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfQUlOUk1PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSU5STU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNODQwMF9BSU5STU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJTlJNT0RFIC0gWzE6MF0gKi8KKworLyoKKyAqIFI0MCAoMHgyOCkgLSBJbnB1dCBNaXhlcjIKKyAqLworI2RlZmluZSBXTTg0MDBfTE1QNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMTVA0ICovCisjZGVmaW5lIFdNODQwMF9MTVA0X01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExNUDQgKi8KKyNkZWZpbmUgV004NDAwX0xNUDRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE1QNCAqLworI2RlZmluZSBXTTg0MDBfTE1QNF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTVA0ICovCisjZGVmaW5lIFdNODQwMF9MTU4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExNTjMgKi8KKyNkZWZpbmUgV004NDAwX0xNTjNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTE1OMyAqLworI2RlZmluZSBXTTg0MDBfTE1OM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBMTU4zICovCisjZGVmaW5lIFdNODQwMF9MTU4zX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExNTjMgKi8KKyNkZWZpbmUgV004NDAwX0xNUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTE1QMiAqLworI2RlZmluZSBXTTg0MDBfTE1QMl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMTVAyICovCisjZGVmaW5lIFdNODQwMF9MTVAyX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExNUDIgKi8KKyNkZWZpbmUgV004NDAwX0xNUDJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE1QMiAqLworI2RlZmluZSBXTTg0MDBfTE1OMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMTU4xICovCisjZGVmaW5lIFdNODQwMF9MTU4xX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExNTjEgKi8KKyNkZWZpbmUgV004NDAwX0xNTjFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTE1OMSAqLworI2RlZmluZSBXTTg0MDBfTE1OMV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTU4xICovCisjZGVmaW5lIFdNODQwMF9STVA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIFJNUDQgKi8KKyNkZWZpbmUgV004NDAwX1JNUDRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogUk1QNCAqLworI2RlZmluZSBXTTg0MDBfUk1QNF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSTVA0ICovCisjZGVmaW5lIFdNODQwMF9STVA0X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJNUDQgKi8KKyNkZWZpbmUgV004NDAwX1JNTjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUk1OMyAqLworI2RlZmluZSBXTTg0MDBfUk1OM19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBSTU4zICovCisjZGVmaW5lIFdNODQwMF9STU4zX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFJNTjMgKi8KKyNkZWZpbmUgV004NDAwX1JNTjNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk1OMyAqLworI2RlZmluZSBXTTg0MDBfUk1QMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSTVAyICovCisjZGVmaW5lIFdNODQwMF9STVAyX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFJNUDIgKi8KKyNkZWZpbmUgV004NDAwX1JNUDJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk1QMiAqLworI2RlZmluZSBXTTg0MDBfUk1QMl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTVAyICovCisjZGVmaW5lIFdNODQwMF9STU4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJNTjEgKi8KKyNkZWZpbmUgV004NDAwX1JNTjFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUk1OMSAqLworI2RlZmluZSBXTTg0MDBfUk1OMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSTU4xICovCisjZGVmaW5lIFdNODQwMF9STU4xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJNTjEgKi8KKworLyoKKyAqIFI0MSAoMHgyOSkgLSBJbnB1dCBNaXhlcjMKKyAqLworI2RlZmluZSBXTTg0MDBfTDM0TU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBMMzRNTkIgKi8KKyNkZWZpbmUgV004NDAwX0wzNE1OQl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTDM0TU5CICovCisjZGVmaW5lIFdNODQwMF9MMzRNTkJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEwzNE1OQiAqLworI2RlZmluZSBXTTg0MDBfTDM0TU5CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMMzRNTkIgKi8KKyNkZWZpbmUgV004NDAwX0wzNE1OQlNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTDM0TU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX0wzNE1OQlNUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTDM0TU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX0wzNE1OQlNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTDM0TU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX0wzNE1OQlNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTDM0TU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX0wxMk1OQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTDEyTU5CICovCisjZGVmaW5lIFdNODQwMF9MMTJNTkJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEwxMk1OQiAqLworI2RlZmluZSBXTTg0MDBfTDEyTU5CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMMTJNTkIgKi8KKyNkZWZpbmUgV004NDAwX0wxMk1OQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTDEyTU5CICovCisjZGVmaW5lIFdNODQwMF9MMTJNTkJTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEwxMk1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MMTJNTkJTVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEwxMk1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MMTJNTkJTVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEwxMk1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MMTJNTkJTVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEwxMk1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MREJWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIExEQlZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9MREJWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExEQlZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9MREJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExEQlZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNDIgKDB4MkEpIC0gSW5wdXQgTWl4ZXI0CisgKi8KKyNkZWZpbmUgV004NDAwX1IzNE1OQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogUjM0TU5CICovCisjZGVmaW5lIFdNODQwMF9SMzRNTkJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFIzNE1OQiAqLworI2RlZmluZSBXTTg0MDBfUjM0TU5CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBSMzRNTkIgKi8KKyNkZWZpbmUgV004NDAwX1IzNE1OQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUjM0TU5CICovCisjZGVmaW5lIFdNODQwMF9SMzRNTkJTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFIzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9SMzRNTkJTVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFIzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9SMzRNTkJTVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFIzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9SMzRNTkJTVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFIzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9SMTJNTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFIxMk1OQiAqLworI2RlZmluZSBXTTg0MDBfUjEyTU5CX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBSMTJNTkIgKi8KKyNkZWZpbmUgV004NDAwX1IxMk1OQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogUjEyTU5CICovCisjZGVmaW5lIFdNODQwMF9SMTJNTkJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFIxMk1OQiAqLworI2RlZmluZSBXTTg0MDBfUjEyTU5CU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUjEyTU5CU1RfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUjEyTU5CU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBSMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUjEyTU5CU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUkRCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBSREJWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfUkRCVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSREJWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfUkRCVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSREJWT0wgLSBbMjowXSAqLworCisvKgorICogUjQzICgweDJCKSAtIElucHV0IE1peGVyNQorICovCisjZGVmaW5lIFdNODQwMF9MSTJCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIExJMkJWT0wgLSBbODo2XSAqLworI2RlZmluZSBXTTg0MDBfTEkyQlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBMSTJCVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xJMkJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTEkyQlZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MUjRCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIExSNEJWT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfTFI0QlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMUjRCVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX0xSNEJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTFI0QlZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9MTDRCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIExMNEJWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfTEw0QlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMTDRCVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xMNEJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTEw0QlZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNDQgKDB4MkMpIC0gSW5wdXQgTWl4ZXI2CisgKi8KKyNkZWZpbmUgV004NDAwX1JJMkJWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDFDMCAgLyogUkkyQlZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9SSTJCVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJJMkJWT0wgLSBbODo2XSAqLworI2RlZmluZSBXTTg0MDBfUkkyQlZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSSTJCVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JMNEJWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAzOCAgLyogUkw0QlZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9STDRCVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJMNEJWT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfUkw0QlZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSTDRCVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX1JSNEJWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogUlI0QlZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9SUjRCVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJSNEJWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfUlI0QlZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSUjRCVk9MIC0gWzI6MF0gKi8KKworLyoKKyAqIFI0NSAoMHgyRCkgLSBPdXRwdXQgTWl4ZXIxCisgKi8KKyNkZWZpbmUgV004NDAwX0xSQkxPICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTFJCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSQkxPX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTFJCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSQkxPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTFJCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSQkxPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFJCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMQkxPICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTExCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMQkxPX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTExCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMQkxPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTExCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMQkxPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTExCTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSSTNMTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTFJJM0xPICovCisjZGVmaW5lIFdNODQwMF9MUkkzTE9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExSSTNMTyAqLworI2RlZmluZSBXTTg0MDBfTFJJM0xPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMUkkzTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSSTNMT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFJJM0xPICovCisjZGVmaW5lIFdNODQwMF9MTEkzTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExMSTNMTyAqLworI2RlZmluZSBXTTg0MDBfTExJM0xPX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMTEkzTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMSTNMT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTExJM0xPICovCisjZGVmaW5lIFdNODQwMF9MTEkzTE9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExMSTNMTyAqLworI2RlZmluZSBXTTg0MDBfTFIxMkxPICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBMUjEyTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTFIxMkxPICovCisjZGVmaW5lIFdNODQwMF9MUjEyTE9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExSMTJMTyAqLworI2RlZmluZSBXTTg0MDBfTFIxMkxPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMUjEyTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTEwxMkxPICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExMMTJMTyAqLworI2RlZmluZSBXTTg0MDBfTEwxMkxPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBMTDEyTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEwxMkxPICovCisjZGVmaW5lIFdNODQwMF9MRExPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExETE8gKi8KKyNkZWZpbmUgV004NDAwX0xETE9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTERMTyAqLworI2RlZmluZSBXTTg0MDBfTERMT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMRExPICovCisjZGVmaW5lIFdNODQwMF9MRExPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETE8gKi8KKworLyoKKyAqIFI0NiAoMHgyRSkgLSBPdXRwdXQgTWl4ZXIyCisgKi8KKyNkZWZpbmUgV004NDAwX1JMQlJPICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUkxCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMQlJPX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUkxCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMQlJPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogUkxCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMQlJPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkxCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSQlJPICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUlJCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSQlJPX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUlJCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSQlJPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogUlJCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSQlJPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUlJCUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMSTNSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogUkxJM1JPICovCisjZGVmaW5lIFdNODQwMF9STEkzUk9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFJMSTNSTyAqLworI2RlZmluZSBXTTg0MDBfUkxJM1JPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBSTEkzUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMSTNST19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkxJM1JPICovCisjZGVmaW5lIFdNODQwMF9SUkkzUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFJSSTNSTyAqLworI2RlZmluZSBXTTg0MDBfUlJJM1JPX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSUkkzUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSSTNST19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUlJJM1JPICovCisjZGVmaW5lIFdNODQwMF9SUkkzUk9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJSSTNSTyAqLworI2RlZmluZSBXTTg0MDBfUkwxMlJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBSTDEyUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogUkwxMlJPICovCisjZGVmaW5lIFdNODQwMF9STDEyUk9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJMMTJSTyAqLworI2RlZmluZSBXTTg0MDBfUkwxMlJPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTDEyUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSMTJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUlIxMlJPICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFJSMTJSTyAqLworI2RlZmluZSBXTTg0MDBfUlIxMlJPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBSUjEyUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSMTJST19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUlIxMlJPICovCisjZGVmaW5lIFdNODQwMF9SRFJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJEUk8gKi8KKyNkZWZpbmUgV004NDAwX1JEUk9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUkRSTyAqLworI2RlZmluZSBXTTg0MDBfUkRST19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSRFJPICovCisjZGVmaW5lIFdNODQwMF9SRFJPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJEUk8gKi8KKworLyoKKyAqIFI0NyAoMHgyRikgLSBPdXRwdXQgTWl4ZXIzCisgKi8KKyNkZWZpbmUgV004NDAwX0xMSTNMT1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDFDMCAgLyogTExJM0xPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xMSTNMT1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTExJM0xPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xMSTNMT1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTExJM0xPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAzOCAgLyogTFIxMkxPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTFIxMkxPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTFIxMkxPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMT1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogTEwxMkxPVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMT1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTEwxMkxPVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMT1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTEwxMkxPVk9MIC0gWzI6MF0gKi8KKworLyoKKyAqIFI0OCAoMHgzMCkgLSBPdXRwdXQgTWl4ZXI0CisgKi8KKyNkZWZpbmUgV004NDAwX1JSSTNST1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDFDMCAgLyogUlJJM1JPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JSSTNST1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogUlJJM1JPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JSSTNST1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUlJJM1JPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAzOCAgLyogUkwxMlJPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUkwxMlJPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUkwxMlJPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX1JSMTJST1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogUlIxMlJPVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JSMTJST1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUlIxMlJPVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JSMTJST1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUlIxMlJPVk9MIC0gWzI6MF0gKi8KKworLyoKKyAqIFI0OSAoMHgzMSkgLSBPdXRwdXQgTWl4ZXI1CisgKi8KKyNkZWZpbmUgV004NDAwX0xSSTNMT1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDFDMCAgLyogTFJJM0xPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xSSTNMT1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTFJJM0xPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xSSTNMT1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTFJJM0xPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xSQkxPVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzOCAgLyogTFJCTE9WT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfTFJCTE9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMUkJMT1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9MUkJMT1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExSQkxPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX0xMQkxPVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogTExCTE9WT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfTExCTE9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMTEJMT1ZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9MTEJMT1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExMQkxPVk9MIC0gWzI6MF0gKi8KKworLyoKKyAqIFI1MCAoMHgzMikgLSBPdXRwdXQgTWl4ZXI2CisgKi8KKyNkZWZpbmUgV004NDAwX1JMSTNST1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDFDMCAgLyogUkxJM1JPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JMSTNST1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogUkxJM1JPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JMSTNST1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUkxJM1JPVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JMQlJPVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzOCAgLyogUkxCUk9WT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfUkxCUk9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSTEJST1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9STEJST1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJMQlJPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX1JSQlJPVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogUlJCUk9WT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfUlJCUk9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSUkJST1ZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9SUkJST1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJSQlJPVk9MIC0gWzI6MF0gKi8KKworLyoKKyAqIFI1MSAoMHgzMykgLSBPdXQzLzQgTWl4ZXIKKyAqLworI2RlZmluZSBXTTg0MDBfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTgwICAvKiBWU0VMIC0gWzg6N10gKi8KKyNkZWZpbmUgV004NDAwX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogVlNFTCAtIFs4OjddICovCisjZGVmaW5lIFdNODQwMF9WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFZTRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg0MDBfTEk0TzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMSTRPMyAqLworI2RlZmluZSBXTTg0MDBfTEk0TzNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMSTRPMyAqLworI2RlZmluZSBXTTg0MDBfTEk0TzNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMSTRPMyAqLworI2RlZmluZSBXTTg0MDBfTEk0TzNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSTRPMyAqLworI2RlZmluZSBXTTg0MDBfTFBHQU8zICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMUEdBTzMgKi8KKyNkZWZpbmUgV004NDAwX0xQR0FPM19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTFBHQU8zICovCisjZGVmaW5lIFdNODQwMF9MUEdBTzNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExQR0FPMyAqLworI2RlZmluZSBXTTg0MDBfTFBHQU8zX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMUEdBTzMgKi8KKyNkZWZpbmUgV004NDAwX1JJNE80ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUkk0TzQgKi8KKyNkZWZpbmUgV004NDAwX1JJNE80X01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUkk0TzQgKi8KKyNkZWZpbmUgV004NDAwX1JJNE80X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkk0TzQgKi8KKyNkZWZpbmUgV004NDAwX1JJNE80X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkk0TzQgKi8KKyNkZWZpbmUgV004NDAwX1JQR0FPNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUlBHQU80ICovCisjZGVmaW5lIFdNODQwMF9SUEdBTzRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJQR0FPNCAqLworI2RlZmluZSBXTTg0MDBfUlBHQU80X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSUEdBTzQgKi8KKyNkZWZpbmUgV004NDAwX1JQR0FPNF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUlBHQU80ICovCisKKy8qCisgKiBSNTIgKDB4MzQpIC0gTGluZSBNaXhlcjEKKyAqLworI2RlZmluZSBXTTg0MDBfTExPUEdBTE9OICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMTE9QR0FMT04gKi8KKyNkZWZpbmUgV004NDAwX0xMT1BHQUxPTl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTExPUEdBTE9OICovCisjZGVmaW5lIFdNODQwMF9MTE9QR0FMT05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIExMT1BHQUxPTiAqLworI2RlZmluZSBXTTg0MDBfTExPUEdBTE9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTE9QR0FMT04gKi8KKyNkZWZpbmUgV004NDAwX0xST1BHQUxPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTFJPUEdBTE9OICovCisjZGVmaW5lIFdNODQwMF9MUk9QR0FMT05fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExST1BHQUxPTiAqLworI2RlZmluZSBXTTg0MDBfTFJPUEdBTE9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMUk9QR0FMT04gKi8KKyNkZWZpbmUgV004NDAwX0xST1BHQUxPTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFJPUEdBTE9OICovCisjZGVmaW5lIFdNODQwMF9MT1BMT04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExPUExPTiAqLworI2RlZmluZSBXTTg0MDBfTE9QTE9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMT1BMT04gKi8KKyNkZWZpbmUgV004NDAwX0xPUExPTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTE9QTE9OICovCisjZGVmaW5lIFdNODQwMF9MT1BMT05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPUExPTiAqLworI2RlZmluZSBXTTg0MDBfTFIxMkxPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMUjEyTE9QICovCisjZGVmaW5lIFdNODQwMF9MUjEyTE9QX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExSMTJMT1AgKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTFIxMkxPUCAqLworI2RlZmluZSBXTTg0MDBfTFIxMkxPUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMUjEyTE9QICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9QICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExMMTJMT1AgKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTEwxMkxPUCAqLworI2RlZmluZSBXTTg0MDBfTEwxMkxPUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTDEyTE9QICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExMMTJMT1AgKi8KKyNkZWZpbmUgV004NDAwX0xMT1BHQUxPUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTExPUEdBTE9QICovCisjZGVmaW5lIFdNODQwMF9MTE9QR0FMT1BfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExMT1BHQUxPUCAqLworI2RlZmluZSBXTTg0MDBfTExPUEdBTE9QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMTE9QR0FMT1AgKi8KKyNkZWZpbmUgV004NDAwX0xMT1BHQUxPUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTExPUEdBTE9QICovCisKKy8qCisgKiBSNTMgKDB4MzUpIC0gTGluZSBNaXhlcjIKKyAqLworI2RlZmluZSBXTTg0MDBfUlJPUEdBUk9OICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBSUk9QR0FST04gKi8KKyNkZWZpbmUgV004NDAwX1JST1BHQVJPTl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUlJPUEdBUk9OICovCisjZGVmaW5lIFdNODQwMF9SUk9QR0FST05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJST1BHQVJPTiAqLworI2RlZmluZSBXTTg0MDBfUlJPUEdBUk9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSUk9QR0FST04gKi8KKyNkZWZpbmUgV004NDAwX1JMT1BHQVJPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogUkxPUEdBUk9OICovCisjZGVmaW5lIFdNODQwMF9STE9QR0FST05fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFJMT1BHQVJPTiAqLworI2RlZmluZSBXTTg0MDBfUkxPUEdBUk9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBSTE9QR0FST04gKi8KKyNkZWZpbmUgV004NDAwX1JMT1BHQVJPTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkxPUEdBUk9OICovCisjZGVmaW5lIFdNODQwMF9ST1BST04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFJPUFJPTiAqLworI2RlZmluZSBXTTg0MDBfUk9QUk9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBST1BST04gKi8KKyNkZWZpbmUgV004NDAwX1JPUFJPTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUk9QUk9OICovCisjZGVmaW5lIFdNODQwMF9ST1BST05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPUFJPTiAqLworI2RlZmluZSBXTTg0MDBfUkwxMlJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBSTDEyUk9QICovCisjZGVmaW5lIFdNODQwMF9STDEyUk9QX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFJMMTJST1AgKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUkwxMlJPUCAqLworI2RlZmluZSBXTTg0MDBfUkwxMlJPUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTDEyUk9QICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9QICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFJSMTJST1AgKi8KKyNkZWZpbmUgV004NDAwX1JSMTJST1BfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUlIxMlJPUCAqLworI2RlZmluZSBXTTg0MDBfUlIxMlJPUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSUjEyUk9QICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJSMTJST1AgKi8KKyNkZWZpbmUgV004NDAwX1JST1BHQVJPUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUlJPUEdBUk9QICovCisjZGVmaW5lIFdNODQwMF9SUk9QR0FST1BfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJST1BHQVJPUCAqLworI2RlZmluZSBXTTg0MDBfUlJPUEdBUk9QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSUk9QR0FST1AgKi8KKyNkZWZpbmUgV004NDAwX1JST1BHQVJPUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUlJPUEdBUk9QICovCisKKy8qCisgKiBSNTQgKDB4MzYpIC0gU3BlYWtlciBNaXhlcgorICovCisjZGVmaW5lIFdNODQwMF9MQjJTUEsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExCMlNQSyAqLworI2RlZmluZSBXTTg0MDBfTEIyU1BLX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMQjJTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xCMlNQS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTEIyU1BLICovCisjZGVmaW5lIFdNODQwMF9MQjJTUEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExCMlNQSyAqLworI2RlZmluZSBXTTg0MDBfUkIyU1BLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBSQjJTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JCMlNQS19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUkIyU1BLICovCisjZGVmaW5lIFdNODQwMF9SQjJTUEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJCMlNQSyAqLworI2RlZmluZSBXTTg0MDBfUkIyU1BLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSQjJTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xJMlNQSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTEkyU1BLICovCisjZGVmaW5lIFdNODQwMF9MSTJTUEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExJMlNQSyAqLworI2RlZmluZSBXTTg0MDBfTEkyU1BLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMSTJTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xJMlNQS19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEkyU1BLICovCisjZGVmaW5lIFdNODQwMF9SSTJTUEsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFJJMlNQSyAqLworI2RlZmluZSBXTTg0MDBfUkkyU1BLX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSSTJTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JJMlNQS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUkkyU1BLICovCisjZGVmaW5lIFdNODQwMF9SSTJTUEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJMlNQSyAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FTUEsgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBMT1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FTUEtfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBMT1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FTUEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMT1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FTUEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FTUEsgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBST1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FTUEtfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBST1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FTUEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBST1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FTUEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1BHQVNQSyAqLworI2RlZmluZSBXTTg0MDBfTERTUEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMRFNQSyAqLworI2RlZmluZSBXTTg0MDBfTERTUEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMRFNQSyAqLworI2RlZmluZSBXTTg0MDBfTERTUEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRFNQSyAqLworI2RlZmluZSBXTTg0MDBfTERTUEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRFNQSyAqLworI2RlZmluZSBXTTg0MDBfUkRTUEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBSRFNQSyAqLworI2RlZmluZSBXTTg0MDBfUkRTUEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBSRFNQSyAqLworI2RlZmluZSBXTTg0MDBfUkRTUEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSRFNQSyAqLworI2RlZmluZSBXTTg0MDBfUkRTUEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSRFNQSyAqLworCisvKgorICogUjU1ICgweDM3KSAtIEFkZGl0aW9uYWwgQ29udHJvbAorICovCisjZGVmaW5lIFdNODQwMF9WUk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFZST0kgKi8KKyNkZWZpbmUgV004NDAwX1ZST0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVlJPSSAqLworI2RlZmluZSBXTTg0MDBfVlJPSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBWUk9JICovCisjZGVmaW5lIFdNODQwMF9WUk9JX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFZST0kgKi8KKworLyoKKyAqIFI1NiAoMHgzOCkgLSBBbnRpUE9QMQorICovCisjZGVmaW5lIFdNODQwMF9ESVNfTExJTkUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERJU19MTElORSAqLworI2RlZmluZSBXTTg0MDBfRElTX0xMSU5FX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBESVNfTExJTkUgKi8KKyNkZWZpbmUgV004NDAwX0RJU19MTElORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRElTX0xMSU5FICovCisjZGVmaW5lIFdNODQwMF9ESVNfTExJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERJU19MTElORSAqLworI2RlZmluZSBXTTg0MDBfRElTX1JMSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBESVNfUkxJTkUgKi8KKyNkZWZpbmUgV004NDAwX0RJU19STElORV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogRElTX1JMSU5FICovCisjZGVmaW5lIFdNODQwMF9ESVNfUkxJTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERJU19STElORSAqLworI2RlZmluZSBXTTg0MDBfRElTX1JMSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBESVNfUkxJTkUgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRElTX09VVDMgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQzX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRElTX09VVDMgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQzX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogRElTX09VVDMgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQzX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRElTX09VVDMgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQ0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRElTX09VVDQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQ0X01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRElTX09VVDQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQ0X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogRElTX09VVDQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19PVVQ0X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRElTX09VVDQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19MT1VUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRElTX0xPVVQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19MT1VUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRElTX0xPVVQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19MT1VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRElTX0xPVVQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19MT1VUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRElTX0xPVVQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19ST1VUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRElTX1JPVVQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19ST1VUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRElTX1JPVVQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19ST1VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRElTX1JPVVQgKi8KKyNkZWZpbmUgV004NDAwX0RJU19ST1VUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRElTX1JPVVQgKi8KKworLyoKKyAqIFI1NyAoMHgzOSkgLSBBbnRpUE9QMgorICovCisjZGVmaW5lIFdNODQwMF9TT0ZUU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNPRlRTVCAqLworI2RlZmluZSBXTTg0MDBfU09GVFNUX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBTT0ZUU1QgKi8KKyNkZWZpbmUgV004NDAwX1NPRlRTVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogU09GVFNUICovCisjZGVmaW5lIFdNODQwMF9TT0ZUU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNPRlRTVCAqLworI2RlZmluZSBXTTg0MDBfQlVGSU9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBCVUZJT0VOICovCisjZGVmaW5lIFdNODQwMF9CVUZJT0VOX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEJVRklPRU4gKi8KKyNkZWZpbmUgV004NDAwX0JVRklPRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQlVGSU9FTiAqLworI2RlZmluZSBXTTg0MDBfQlVGSU9FTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCVUZJT0VOICovCisjZGVmaW5lIFdNODQwMF9CVUZEQ09QRU4gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEJVRkRDT1BFTiAqLworI2RlZmluZSBXTTg0MDBfQlVGRENPUEVOX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBCVUZEQ09QRU4gKi8KKyNkZWZpbmUgV004NDAwX0JVRkRDT1BFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQlVGRENPUEVOICovCisjZGVmaW5lIFdNODQwMF9CVUZEQ09QRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJVRkRDT1BFTiAqLworI2RlZmluZSBXTTg0MDBfUE9CQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBQT0JDVFJMICovCisjZGVmaW5lIFdNODQwMF9QT0JDVFJMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFBPQkNUUkwgKi8KKyNkZWZpbmUgV004NDAwX1BPQkNUUkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUE9CQ1RSTCAqLworI2RlZmluZSBXTTg0MDBfUE9CQ1RSTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBQT0JDVFJMICovCisjZGVmaW5lIFdNODQwMF9WTUlEVE9HICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFZNSURUT0cgKi8KKyNkZWZpbmUgV004NDAwX1ZNSURUT0dfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVk1JRFRPRyAqLworI2RlZmluZSBXTTg0MDBfVk1JRFRPR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBWTUlEVE9HICovCisjZGVmaW5lIFdNODQwMF9WTUlEVE9HX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFZNSURUT0cgKi8KKworLyoKKyAqIFI1OCAoMHgzQSkgLSBNSUNCSUFTCisgKi8KKyNkZWZpbmUgV004NDAwX01DRFNDVEhfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDBDMCAgLyogTUNEU0NUSCAtIFs3OjZdICovCisjZGVmaW5lIFdNODQwMF9NQ0RTQ1RIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIE1DRFNDVEggLSBbNzo2XSAqLworI2RlZmluZSBXTTg0MDBfTUNEU0NUSF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBNQ0RTQ1RIIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004NDAwX01DRFRIUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAzOCAgLyogTUNEVEhSIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX01DRFRIUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUNEVEhSIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX01DRFRIUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUNEVEhSIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX01DRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTUNEICovCisjZGVmaW5lIFdNODQwMF9NQ0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIE1DRCAqLworI2RlZmluZSBXTTg0MDBfTUNEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBNQ0QgKi8KKyNkZWZpbmUgV004NDAwX01DRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUNEICovCisjZGVmaW5lIFdNODQwMF9NQlNFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1CU0VMICovCisjZGVmaW5lIFdNODQwMF9NQlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1CU0VMICovCisjZGVmaW5lIFdNODQwMF9NQlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1CU0VMICovCisjZGVmaW5lIFdNODQwMF9NQlNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1CU0VMICovCisKKy8qCisgKiBSNjAgKDB4M0MpIC0gRkxMIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODQwMF9GTExfUkVGX0ZSRVEgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEZMTF9SRUZfRlJFUSAqLworI2RlZmluZSBXTTg0MDBfRkxMX1JFRl9GUkVRX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBGTExfUkVGX0ZSRVEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9SRUZfRlJFUV9TSElGVCAgICAgICAgICAgICAgICAgICAxMiAgLyogRkxMX1JFRl9GUkVRICovCisjZGVmaW5lIFdNODQwMF9GTExfUkVGX0ZSRVFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9SRUZfRlJFUSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0NMS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHgwQzAwICAvKiBGTExfQ0xLX1NSQyAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9DTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAxMCAgLyogRkxMX0NMS19TUkMgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODQwMF9GTExfQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEZMTF9DTEtfU1JDIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0ZSQUMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTg0MDBfRkxMX0ZSQUNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTg0MDBfRkxMX0ZSQUNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTg0MDBfRkxMX0ZSQUNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTg0MDBfRkxMX09TQ19FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX09TQ19FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX09TQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX09TQ19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0NUUkxfUkFURV9NQVNLICAgICAgICAgICAgICAgMHgwMEUwICAvKiBGTExfQ1RSTF9SQVRFIC0gWzc6NV0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9DVFJMX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgNSAgLyogRkxMX0NUUkxfUkFURSAtIFs3OjVdICovCisjZGVmaW5lIFdNODQwMF9GTExfQ1RSTF9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgIDMgIC8qIEZMTF9DVFJMX1JBVEUgLSBbNzo1XSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBGTExfRlJBVElPIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9GUkFUSU9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0ZSQVRJTyAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9GTExfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEZMTF9GUkFUSU8gLSBbNDowXSAqLworCisvKgorICogUjYxICgweDNEKSAtIEZMTCBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTg0MDBfRkxMX0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBGTExfSyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfSyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0tfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBGTExfSyAtIFsxNTowXSAqLworCisvKgorICogUjYyICgweDNFKSAtIEZMTCBDb250cm9sIDMKKyAqLworI2RlZmluZSBXTTg0MDBfRkxMX05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwM0ZGICAvKiBGTExfTiAtIFs5OjBdICovCisjZGVmaW5lIFdNODQwMF9GTExfTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9OIC0gWzk6MF0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogRkxMX04gLSBbOTowXSAqLworCisvKgorICogUjYzICgweDNGKSAtIEZMTCBDb250cm9sIDQKKyAqLworI2RlZmluZSBXTTg0MDBfRkxMX1RSS19HQUlOX01BU0sgICAgICAgICAgICAgICAgMHgwMDc4ICAvKiBGTExfVFJLX0dBSU4gLSBbNjozXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX1RSS19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAzICAvKiBGTExfVFJLX0dBSU4gLSBbNjozXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX1RSS19HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICA0ICAvKiBGTExfVFJLX0dBSU4gLSBbNjozXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX09VVERJVl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBGTExfT1VURElWIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9PVVRESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX09VVERJViAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9GTExfT1VURElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEZMTF9PVVRESVYgLSBbMjowXSAqLworCit2b2lkIHdtODQwMF9yZXNldF9jb2RlY19yZWdfY2FjaGUoc3RydWN0IHdtODQwMCAqd204NDAwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTg0MDAtcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLXByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWFiNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLXByaXZhdGUuaApAQCAtMCwwICsxLDkzNiBAQAorLyoKKyAqIHdtODQwMCBwcml2YXRlIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODQwMF9QUklWX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfV004NDAwX1BSSVZfSAorCisjaW5jbHVkZSA8bGludXgvbWZkL3dtODQwMC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgV004NDAwX1JFR0lTVEVSX0NPVU5UIDB4NTUKKworc3RydWN0IHdtODQwMCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJaW50ICgqcmVhZF9kZXYpKHZvaWQgKmRhdGEsIGNoYXIgcmVnLCBpbnQgY291bnQsIHUxNiAqZHN0KTsKKwlpbnQgKCp3cml0ZV9kZXYpKHZvaWQgKmRhdGEsIGNoYXIgcmVnLCBpbnQgY291bnQsIGNvbnN0IHUxNiAqc3JjKTsKKworCXN0cnVjdCBtdXRleCBpb19sb2NrOworCXZvaWQgKmlvX2RhdGE7CisKKwl1MTYgcmVnX2NhY2hlW1dNODQwMF9SRUdJU1RFUl9DT1VOVF07CisKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJlZ3VsYXRvcnNbNl07Cit9OworCisvKgorICogUmVnaXN0ZXIgdmFsdWVzLgorICovCisjZGVmaW5lIFdNODQwMF9SRVNFVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFdNODQwMF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFdNODQwMF9QT1dFUl9NQU5BR0VNRU5UXzEgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFdNODQwMF9QT1dFUl9NQU5BR0VNRU5UXzIgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFdNODQwMF9QT1dFUl9NQU5BR0VNRU5UXzMgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFdNODQwMF9BVURJT19JTlRFUkZBQ0VfMSAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFdNODQwMF9BVURJT19JTlRFUkZBQ0VfMiAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFdNODQwMF9DTE9DS0lOR18xICAgICAgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIFdNODQwMF9DTE9DS0lOR18yICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFdNODQwMF9BVURJT19JTlRFUkZBQ0VfMyAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIFdNODQwMF9BVURJT19JTlRFUkZBQ0VfNCAgICAgICAgICAgICAgICAweDBBCisjZGVmaW5lIFdNODQwMF9EQUNfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIFdNODQwMF9MRUZUX0RBQ19ESUdJVEFMX1ZPTFVNRSAgICAgICAgICAweDBDCisjZGVmaW5lIFdNODQwMF9SSUdIVF9EQUNfRElHSVRBTF9WT0xVTUUgICAgICAgICAweDBECisjZGVmaW5lIFdNODQwMF9ESUdJVEFMX1NJREVfVE9ORSAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIFdNODQwMF9BRENfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIFdNODQwMF9MRUZUX0FEQ19ESUdJVEFMX1ZPTFVNRSAgICAgICAgICAweDEwCisjZGVmaW5lIFdNODQwMF9SSUdIVF9BRENfRElHSVRBTF9WT0xVTUUgICAgICAgICAweDExCisjZGVmaW5lIFdNODQwMF9HUElPX0NUUkxfMSAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFdNODQwMF9HUElPMV9HUElPMiAgICAgICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIFdNODQwMF9HUElPM19HUElPNCAgICAgICAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIFdNODQwMF9HUElPNV9HUElPNiAgICAgICAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIFdNODQwMF9HUElPQ1RSTF8yICAgICAgICAgICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIFdNODQwMF9HUElPX1BPTCAgICAgICAgICAgICAgICAgICAgICAgICAweDE3CisjZGVmaW5lIFdNODQwMF9MRUZUX0xJTkVfSU5QVVRfMV8yX1ZPTFVNRSAgICAgICAweDE4CisjZGVmaW5lIFdNODQwMF9MRUZUX0xJTkVfSU5QVVRfM180X1ZPTFVNRSAgICAgICAweDE5CisjZGVmaW5lIFdNODQwMF9SSUdIVF9MSU5FX0lOUFVUXzFfMl9WT0xVTUUgICAgICAweDFBCisjZGVmaW5lIFdNODQwMF9SSUdIVF9MSU5FX0lOUFVUXzNfNF9WT0xVTUUgICAgICAweDFCCisjZGVmaW5lIFdNODQwMF9MRUZUX09VVFBVVF9WT0xVTUUgICAgICAgICAgICAgICAweDFDCisjZGVmaW5lIFdNODQwMF9SSUdIVF9PVVRQVVRfVk9MVU1FICAgICAgICAgICAgICAweDFECisjZGVmaW5lIFdNODQwMF9MSU5FX09VVFBVVFNfVk9MVU1FICAgICAgICAgICAgICAweDFFCisjZGVmaW5lIFdNODQwMF9PVVQzXzRfVk9MVU1FICAgICAgICAgICAgICAgICAgICAweDFGCisjZGVmaW5lIFdNODQwMF9MRUZUX09QR0FfVk9MVU1FICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFdNODQwMF9SSUdIVF9PUEdBX1ZPTFVNRSAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIFdNODQwMF9TUEVBS0VSX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIFdNODQwMF9DTEFTU0QxICAgICAgICAgICAgICAgICAgICAgICAgICAweDIzCisjZGVmaW5lIFdNODQwMF9DTEFTU0QzICAgICAgICAgICAgICAgICAgICAgICAgICAweDI1CisjZGVmaW5lIFdNODQwMF9JTlBVVF9NSVhFUjEgICAgICAgICAgICAgICAgICAgICAweDI3CisjZGVmaW5lIFdNODQwMF9JTlBVVF9NSVhFUjIgICAgICAgICAgICAgICAgICAgICAweDI4CisjZGVmaW5lIFdNODQwMF9JTlBVVF9NSVhFUjMgICAgICAgICAgICAgICAgICAgICAweDI5CisjZGVmaW5lIFdNODQwMF9JTlBVVF9NSVhFUjQgICAgICAgICAgICAgICAgICAgICAweDJBCisjZGVmaW5lIFdNODQwMF9JTlBVVF9NSVhFUjUgICAgICAgICAgICAgICAgICAgICAweDJCCisjZGVmaW5lIFdNODQwMF9JTlBVVF9NSVhFUjYgICAgICAgICAgICAgICAgICAgICAweDJDCisjZGVmaW5lIFdNODQwMF9PVVRQVVRfTUlYRVIxICAgICAgICAgICAgICAgICAgICAweDJECisjZGVmaW5lIFdNODQwMF9PVVRQVVRfTUlYRVIyICAgICAgICAgICAgICAgICAgICAweDJFCisjZGVmaW5lIFdNODQwMF9PVVRQVVRfTUlYRVIzICAgICAgICAgICAgICAgICAgICAweDJGCisjZGVmaW5lIFdNODQwMF9PVVRQVVRfTUlYRVI0ICAgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIFdNODQwMF9PVVRQVVRfTUlYRVI1ICAgICAgICAgICAgICAgICAgICAweDMxCisjZGVmaW5lIFdNODQwMF9PVVRQVVRfTUlYRVI2ICAgICAgICAgICAgICAgICAgICAweDMyCisjZGVmaW5lIFdNODQwMF9PVVQzXzRfTUlYRVIgICAgICAgICAgICAgICAgICAgICAweDMzCisjZGVmaW5lIFdNODQwMF9MSU5FX01JWEVSMSAgICAgICAgICAgICAgICAgICAgICAweDM0CisjZGVmaW5lIFdNODQwMF9MSU5FX01JWEVSMiAgICAgICAgICAgICAgICAgICAgICAweDM1CisjZGVmaW5lIFdNODQwMF9TUEVBS0VSX01JWEVSICAgICAgICAgICAgICAgICAgICAweDM2CisjZGVmaW5lIFdNODQwMF9BRERJVElPTkFMX0NPTlRST0wgICAgICAgICAgICAgICAweDM3CisjZGVmaW5lIFdNODQwMF9BTlRJUE9QMSAgICAgICAgICAgICAgICAgICAgICAgICAweDM4CisjZGVmaW5lIFdNODQwMF9BTlRJUE9QMiAgICAgICAgICAgICAgICAgICAgICAgICAweDM5CisjZGVmaW5lIFdNODQwMF9NSUNCSUFTICAgICAgICAgICAgICAgICAgICAgICAgICAweDNBCisjZGVmaW5lIFdNODQwMF9GTExfQ09OVFJPTF8xICAgICAgICAgICAgICAgICAgICAweDNDCisjZGVmaW5lIFdNODQwMF9GTExfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgICAweDNECisjZGVmaW5lIFdNODQwMF9GTExfQ09OVFJPTF8zICAgICAgICAgICAgICAgICAgICAweDNFCisjZGVmaW5lIFdNODQwMF9GTExfQ09OVFJPTF80ICAgICAgICAgICAgICAgICAgICAweDNGCisjZGVmaW5lIFdNODQwMF9MRE8xX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDQxCisjZGVmaW5lIFdNODQwMF9MRE8yX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDQyCisjZGVmaW5lIFdNODQwMF9MRE8zX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDQzCisjZGVmaW5lIFdNODQwMF9MRE80X0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDQ0CisjZGVmaW5lIFdNODQwMF9EQ0RDMV9DT05UUk9MXzEgICAgICAgICAgICAgICAgICAweDQ2CisjZGVmaW5lIFdNODQwMF9EQ0RDMV9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAweDQ3CisjZGVmaW5lIFdNODQwMF9EQ0RDMl9DT05UUk9MXzEgICAgICAgICAgICAgICAgICAweDQ4CisjZGVmaW5lIFdNODQwMF9EQ0RDMl9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAweDQ5CisjZGVmaW5lIFdNODQwMF9JTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDRCCisjZGVmaW5lIFdNODQwMF9QTV9HRU5FUkFMICAgICAgICAgICAgICAgICAgICAgICAweDRDCisjZGVmaW5lIFdNODQwMF9QTV9TSFVURE9XTl9DT05UUk9MICAgICAgICAgICAgICAweDRFCisjZGVmaW5lIFdNODQwMF9JTlRFUlJVUFRfU1RBVFVTXzEgICAgICAgICAgICAgICAweDRGCisjZGVmaW5lIFdNODQwMF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSyAgICAgICAgICAweDUwCisjZGVmaW5lIFdNODQwMF9JTlRFUlJVUFRfTEVWRUxTICAgICAgICAgICAgICAgICAweDUxCisjZGVmaW5lIFdNODQwMF9TSFVURE9XTl9SRUFTT04gICAgICAgICAgICAgICAgICAweDUyCisjZGVmaW5lIFdNODQwMF9MSU5FX0NJUkNVSVRTICAgICAgICAgICAgICAgICAgICAweDU0CisKKy8qCisgKiBGaWVsZCBEZWZpbml0aW9ucy4KKyAqLworCisvKgorICogUjAgKDB4MDApIC0gUmVzZXQvSUQKKyAqLworI2RlZmluZSBXTTg0MDBfU1dfUkVTRVRfQ0hJUF9JRF9NQVNLICAgICAgICAgICAgMHhGRkZGICAvKiBTV19SRVNFVC9DSElQX0lEIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODQwMF9TV19SRVNFVF9DSElQX0lEX1NISUZUICAgICAgICAgICAgICAgIDAgIC8qIFNXX1JFU0VUL0NISVBfSUQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004NDAwX1NXX1JFU0VUX0NISVBfSURfV0lEVEggICAgICAgICAgICAgICAxNiAgLyogU1dfUkVTRVQvQ0hJUF9JRCAtIFsxNTowXSAqLworCisvKgorICogUjEgKDB4MDEpIC0gSUQKKyAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9SRVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3MDAwICAvKiBDSElQX1JFViAtIFsxNDoxMl0gKi8KKyNkZWZpbmUgV004NDAwX0NISVBfUkVWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogQ0hJUF9SRVYgLSBbMTQ6MTJdICovCisjZGVmaW5lIFdNODQwMF9DSElQX1JFVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIENISVBfUkVWIC0gWzE0OjEyXSAqLworCisvKgorICogUjE4ICgweDEyKSAtIEdQSU8gQ1RSTCAxCisgKi8KKyNkZWZpbmUgV004NDAwX0lSUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogSVJRICovCisjZGVmaW5lIFdNODQwMF9JUlFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElSUSAqLworI2RlZmluZSBXTTg0MDBfSVJRX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBJUlEgKi8KKyNkZWZpbmUgV004NDAwX0lSUV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSVJRICovCisjZGVmaW5lIFdNODQwMF9URU1QT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIFRFTVBPSyAqLworI2RlZmluZSBXTTg0MDBfVEVNUE9LX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBURU1QT0sgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogVEVNUE9LICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRFTVBPSyAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBNSUMxU0hSVCAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBNSUMxU0hSVCAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBNSUMxU0hSVCAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUMxU0hSVCAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBNSUMxREVUICovCisjZGVmaW5lIFdNODQwMF9NSUMxREVUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE1JQzFERVQgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogTUlDMURFVCAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUMxREVUICovCisjZGVmaW5lIFdNODQwMF9GTExfTENLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEZMTF9MQ0sgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRkxMX0xDSyAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTExfTENLICovCisjZGVmaW5lIFdNODQwMF9GTExfTENLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9MQ0sgKi8KKyNkZWZpbmUgV004NDAwX0dQSU9fU1RBVFVTX01BU0sgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogR1BJT19TVEFUVVMgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfR1BJT19TVEFUVVNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUElPX1NUQVRVUyAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9HUElPX1NUQVRVU19XSURUSCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEdQSU9fU1RBVFVTIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxOSAoMHgxMykgLSBHUElPMSAmIEdQSU8yCisgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX0RFQl9FTkEgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogR1BJTzJfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfREVCX0VOQV9NQVNLICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUElPMl9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9ERUJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTUgIC8qIEdQSU8yX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX0RFQl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzJfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfSVJRX0VOQSAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUElPMl9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9JUlFfRU5BX01BU0sgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQSU8yX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX0lSUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAxNCAgLyogR1BJTzJfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPMl9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QVSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEdQSU8yX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEdQSU8yX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQSU8yX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8yX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEdQSU8yX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEdQSU8yX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIEdQSU8yX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8yX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDBGMDAgIC8qIEdQSU8yX1NFTCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBHUElPMl9TRUwgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1BJTzJfU0VMIC0gWzExOjhdICovCisjZGVmaW5lIFdNODQwMF9HUElPMV9ERUJfRU5BICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQSU8xX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX0RFQl9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1BJTzFfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfREVCX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICA3ICAvKiBHUElPMV9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMV9ERUJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8xX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX0lSUV9FTkEgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1BJTzFfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfSVJRX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUElPMV9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMV9JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQSU8xX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX0lSUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzFfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUElPMV9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUElPMV9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBHUElPMV9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPMV9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUElPMV9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUElPMV9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUElPMV9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPMV9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBHUElPMV9TRUwgLSBbMzowXSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUElPMV9TRUwgLSBbMzowXSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUElPMV9TRUwgLSBbMzowXSAqLworCisvKgorICogUjIwICgweDE0KSAtIEdQSU8zICYgR1BJTzQKKyAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfREVCX0VOQSAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUElPNF9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9ERUJfRU5BX01BU0sgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQSU80X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X0RFQl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAxNSAgLyogR1BJTzRfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfREVCX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPNF9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9JUlFfRU5BICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQSU80X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X0lSUV9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4NDAwMCAgLyogR1BJTzRfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDE0ICAvKiBHUElPNF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU80X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BVICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1BJTzRfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BVX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1BJTzRfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogR1BJTzRfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzRfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogR1BJTzRfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogR1BJTzRfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogR1BJTzRfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzRfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1NFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MEYwMCAgLyogR1BJTzRfU0VMIC0gWzExOjhdICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEdQSU80X1NFTCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUElPNF9TRUwgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU8zX0RFQl9FTkEgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1BJTzNfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfREVCX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUElPM19ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPM19ERUJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDcgIC8qIEdQSU8zX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8zX0RFQl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzNfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfSVJRX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUElPM19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPM19JUlFfRU5BX01BU0sgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQSU8zX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8zX0lSUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogR1BJTzNfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPM19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QVSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEdQSU8zX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QVV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEdQSU8zX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEdQSU8zX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8zX1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQSU8zX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQSU8zX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQSU8zX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPM19QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8zX1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPM19TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIEdQSU8zX1NFTCAtIFszOjBdICovCisjZGVmaW5lIFdNODQwMF9HUElPM19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQSU8zX1NFTCAtIFszOjBdICovCisjZGVmaW5lIFdNODQwMF9HUElPM19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQSU8zX1NFTCAtIFszOjBdICovCisKKy8qCisgKiBSMjEgKDB4MTUpIC0gR1BJTzUgJiBHUElPNgorICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9ERUJfRU5BICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQSU82X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X0RFQl9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4ODAwMCAgLyogR1BJTzZfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfREVCX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDE1ICAvKiBHUElPNl9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9ERUJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU82X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X0lSUV9FTkEgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogR1BJTzZfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfSVJRX0VOQV9NQVNLICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUElPNl9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTQgIC8qIEdQSU82X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X0lSUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzZfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUElPNl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUElPNl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBHUElPNl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPNl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBHUElPNl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBHUElPNl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBHUElPNl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPNl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwRjAwICAvKiBHUElPNl9TRUwgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1BJTzZfU0VMIC0gWzExOjhdICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQSU82X1NFTCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzVfREVCX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUElPNV9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9ERUJfRU5BX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQSU81X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X0RFQl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogR1BJTzVfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzVfREVCX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPNV9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9JUlFfRU5BICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQSU81X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X0lSUV9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1BJTzVfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzVfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICA2ICAvKiBHUElPNV9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU81X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BVICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1BJTzVfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BVX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1BJTzVfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1BJTzVfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzVfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1BJTzVfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1BJTzVfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1BJTzVfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzVfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1NFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogR1BJTzVfU0VMIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1BJTzVfU0VMIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1BJTzVfU0VMIC0gWzM6MF0gKi8KKworLyoKKyAqIFIyMiAoMHgxNikgLSBHUElPQ1RSTCAyCisgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19JUlFfRU5BICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogVEVNUE9LX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19JUlFfRU5BX01BU0sgICAgICAgICAgICAgIDB4MDgwMCAgLyogVEVNUE9LX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAxMSAgLyogVEVNUE9LX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogVEVNUE9LX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX0lSUV9FTkEgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTUlDMVNIUlRfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfSVJRX0VOQV9NQVNLICAgICAgICAgICAgMHgwNDAwICAvKiBNSUMxU0hSVF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9NSUMxU0hSVF9JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgMTAgIC8qIE1JQzFTSFJUX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX0lSUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogTUlDMVNIUlRfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9JUlFfRU5BICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBNSUMxREVUX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfSVJRX0VOQV9NQVNLICAgICAgICAgICAgIDB4MDIwMCAgLyogTUlDMURFVF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9NSUMxREVUX0lSUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgIDkgIC8qIE1JQzFERVRfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBNSUMxREVUX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfSVJRX0VOQSAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRkxMX0xDS19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9GTExfTENLX0lSUV9FTkFfTUFTSyAgICAgICAgICAgICAweDAxMDAgIC8qIEZMTF9MQ0tfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICA4ICAvKiBGTExfTENLX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogRkxMX0xDS19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0RFQl9FTkEgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQSThfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJOF9ERUJfRU5BX01BU0sgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUEk4X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfREVCX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgNyAgLyogR1BJOF9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0RFQl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSThfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJOF9JUlFfRU5BICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUEk4X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfSVJRX0VOQV9NQVNLICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1BJOF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0lSUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQSThfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJOF9JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBHUEk4X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1BJOF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1BJOF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1BJOF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJOF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfREVCX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1BJN19ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk3X0RFQl9FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQSTdfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19ERUJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAzICAvKiBHUEk3X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfREVCX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJN19ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk3X0lSUV9FTkEgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEdQSTdfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19JUlFfRU5BX01BU0sgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUEk3X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgMiAgLyogR1BJN19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk3X0lSUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSTdfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBHUEk3X0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBHUEk3X0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUEk3X0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUEk3X0VOQSAqLworCisvKgorICogUjIzICgweDE3KSAtIEdQSU9fUE9MCisgKi8KKyNkZWZpbmUgV004NDAwX0lSUV9JTlYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogSVJRX0lOViAqLworI2RlZmluZSBXTTg0MDBfSVJRX0lOVl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBJUlFfSU5WICovCisjZGVmaW5lIFdNODQwMF9JUlFfSU5WX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIElSUV9JTlYgKi8KKyNkZWZpbmUgV004NDAwX0lSUV9JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSVJRX0lOViAqLworI2RlZmluZSBXTTg0MDBfVEVNUE9LX1BPTCAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBURU1QT0tfUE9MICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfUE9MX01BU0sgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIFRFTVBPS19QT0wgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMSAgLyogVEVNUE9LX1BPTCAqLworI2RlZmluZSBXTTg0MDBfVEVNUE9LX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBURU1QT0tfUE9MICovCisjZGVmaW5lIFdNODQwMF9NSUMxU0hSVF9QT0wgICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIE1JQzFTSFJUX1BPTCAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfUE9MX01BU0sgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBNSUMxU0hSVF9QT0wgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAxMCAgLyogTUlDMVNIUlRfUE9MICovCisjZGVmaW5lIFdNODQwMF9NSUMxU0hSVF9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQzFTSFJUX1BPTCAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9QT0wgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBNSUMxREVUX1BPTCAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9QT0xfTUFTSyAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBNSUMxREVUX1BPTCAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICA5ICAvKiBNSUMxREVUX1BPTCAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUMxREVUX1BPTCAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19QT0wgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBGTExfTENLX1BPTCAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19QT0xfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBGTExfTENLX1BPTCAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTExfTENLX1BPTCAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfTENLX1BPTCAqLworI2RlZmluZSBXTTg0MDBfR1BJT19QT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBHUElPX1BPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9HUElPX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQSU9fUE9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU9fUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1BJT19QT0wgLSBbNzowXSAqLworCisvKgorICogUjY1ICgweDQxKSAtIExETyAxIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE8xX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE8xX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBMRE8xX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8xX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9TV0kgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMRE8xX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9TV0lfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMRE8xX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9TV0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBMRE8xX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9TV0lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8xX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBMRE8xX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8xX09QRkxUX01BU0sgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIExETzFfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfT1BGTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMiAgLyogTERPMV9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9PUEZMVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8xX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8xX0VSUkFDVCAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIExETzFfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8xX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIExETzFfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8xX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTEgIC8qIExETzFfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8xX0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzFfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8xX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIExETzFfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTERPMV9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9ISUJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgIDEwICAvKiBMRE8xX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8xX0hJQl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzFfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVklNR19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDNFMCAgLyogTERPMV9WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVklNR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPMV9WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVklNR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPMV9WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogTERPMV9WU0VMIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTERPMV9WU0VMIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVlNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPMV9WU0VMIC0gWzQ6MF0gKi8KKworLyoKKyAqIFI2NiAoMHg0MikgLSBMRE8gMiBDb250cm9sCisgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogTERPMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfU1dJICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTERPMl9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfU1dJX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTERPMl9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfU1dJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogTERPMl9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfU1dJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogTERPMl9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9PUEZMVF9NQVNLICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBMRE8yX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8yX09QRkxUX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIExETzJfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfT1BGTFRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9FUlJBQ1QgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBMRE8yX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBMRE8yX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBMRE8yX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9FUlJBQ1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8yX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBMRE8yX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8yX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAweDA0MDAgIC8qIExETzJfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAxMCAgLyogTERPMl9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9ISUJfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8yX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAweDAzRTAgIC8qIExETzJfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1ZJTUdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzJfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1ZJTUdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzJfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIExETzJfVlNFTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExETzJfVlNFTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1ZTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzJfVlNFTCAtIFs0OjBdICovCisKKy8qCisgKiBSNjcgKDB4NDMpIC0gTERPIDMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIExETzNfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIExETzNfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIExETzNfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzNfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1NXSSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIExETzNfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1NXSV9NQVNLICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIExETzNfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1NXSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIExETzNfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1NXSV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzNfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8zX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIExETzNfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfT1BGTFRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogTERPM19PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPM19PUEZMVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBMRE8zX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8zX09QRkxUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzNfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfRVJSQUNUICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogTERPM19FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogTERPM19FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAxMSAgLyogTERPM19FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfRVJSQUNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPM19FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfSElCX01PREUgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTERPM19ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPM19ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgMHgwNDAwICAvKiBMRE8zX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0hJQl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgMTAgIC8qIExETzNfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfSElCX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogTERPM19ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPM19WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgMHgwM0UwICAvKiBMRE8zX1ZJTUcgLSBbOTo1XSAqLworI2RlZmluZSBXTTg0MDBfTERPM19WSU1HX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8zX1ZJTUcgLSBbOTo1XSAqLworI2RlZmluZSBXTTg0MDBfTERPM19WSU1HX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8zX1ZJTUcgLSBbOTo1XSAqLworI2RlZmluZSBXTTg0MDBfTERPM19WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBMRE8zX1ZTRUwgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfTERPM19WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMRE8zX1ZTRUwgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfTERPM19WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8zX1ZTRUwgLSBbNDowXSAqLworCisvKgorICogUjY4ICgweDQ0KSAtIExETyA0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE80X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE80X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBMRE80X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE80X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9TV0kgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMRE80X1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9TV0lfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMRE80X1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9TV0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBMRE80X1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9TV0lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE80X1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBMRE80X09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE80X09QRkxUX01BU0sgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIExETzRfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfT1BGTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMiAgLyogTERPNF9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9PUEZMVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE80X09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE80X0VSUkFDVCAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIExETzRfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE80X0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIExETzRfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE80X0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTEgIC8qIExETzRfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE80X0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzRfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE80X0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIExETzRfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTERPNF9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9ISUJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgIDEwICAvKiBMRE80X0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE80X0hJQl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzRfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVklNR19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDNFMCAgLyogTERPNF9WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVklNR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPNF9WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVklNR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPNF9WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogTERPNF9WU0VMIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTERPNF9WU0VMIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVlNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPNF9WU0VMIC0gWzQ6MF0gKi8KKworLyoKKyAqIFI3MCAoMHg0NikgLSBEQ0RDMSBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTg0MDBfREMxX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBEQzFfRU5BICovCisjZGVmaW5lIFdNODQwMF9EQzFfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIERDMV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogREMxX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREMxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfRU5BICovCisjZGVmaW5lIFdNODQwMF9EQzFfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIERDMV9BQ1RJVkUgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9BQ1RJVkVfTUFTSyAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogREMxX0FDVElWRSAqLworI2RlZmluZSBXTTg0MDBfREMxX0FDVElWRV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBEQzFfQUNUSVZFICovCisjZGVmaW5lIFdNODQwMF9EQzFfQUNUSVZFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMV9BQ1RJVkUgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogREMxX1NMRUVQICovCisjZGVmaW5lIFdNODQwMF9EQzFfU0xFRVBfTUFTSyAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIERDMV9TTEVFUCAqLworI2RlZmluZSBXTTg0MDBfREMxX1NMRUVQX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBEQzFfU0xFRVAgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9TTEVFUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMxX1NMRUVQICovCisjZGVmaW5lIFdNODQwMF9EQzFfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIERDMV9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfREMxX09QRkxUX01BU0sgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBEQzFfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9PUEZMVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogREMxX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9EQzFfT1BGTFRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMV9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfREMxX0VSUkFDVCAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBEQzFfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9EQzFfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIERDMV9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMSAgLyogREMxX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfREMxX0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9EQzFfSElCX01PREUgICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIERDMV9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREMxX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBEQzFfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9ISUJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAxMCAgLyogREMxX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9EQzFfSElCX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMV9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREMxX1NPRlRTVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMzAwICAvKiBEQzFfU09GVFNUIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMV9TT0ZUU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogREMxX1NPRlRTVCAtIFs5OjhdICovCisjZGVmaW5lIFdNODQwMF9EQzFfU09GVFNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERDMV9TT0ZUU1QgLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMxX09WX1BST1QgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQzFfT1ZfUFJPVCAqLworI2RlZmluZSBXTTg0MDBfREMxX09WX1BST1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQzFfT1ZfUFJPVCAqLworI2RlZmluZSBXTTg0MDBfREMxX09WX1BST1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICA3ICAvKiBEQzFfT1ZfUFJPVCAqLworI2RlZmluZSBXTTg0MDBfREMxX09WX1BST1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfT1ZfUFJPVCAqLworI2RlZmluZSBXTTg0MDBfREMxX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBEQzFfVlNFTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9EQzFfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERDMV9WU0VMIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMV9WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogREMxX1ZTRUwgLSBbNjowXSAqLworCisvKgorICogUjcxICgweDQ3KSAtIERDREMxIENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNODQwMF9EQzFfRlJDX1BXTSAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIERDMV9GUkNfUFdNICovCisjZGVmaW5lIFdNODQwMF9EQzFfRlJDX1BXTV9NQVNLICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIERDMV9GUkNfUFdNICovCisjZGVmaW5lIFdNODQwMF9EQzFfRlJDX1BXTV9TSElGVCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIERDMV9GUkNfUFdNICovCisjZGVmaW5lIFdNODQwMF9EQzFfRlJDX1BXTV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMV9GUkNfUFdNICovCisjZGVmaW5lIFdNODQwMF9EQzFfU1RCWV9MSU1fTUFTSyAgICAgICAgICAgICAgICAweDAzMDAgIC8qIERDMV9TVEJZX0xJTSAtIFs5OjhdICovCisjZGVmaW5lIFdNODQwMF9EQzFfU1RCWV9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgIDggIC8qIERDMV9TVEJZX0xJTSAtIFs5OjhdICovCisjZGVmaW5lIFdNODQwMF9EQzFfU1RCWV9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgIDIgIC8qIERDMV9TVEJZX0xJTSAtIFs5OjhdICovCisjZGVmaW5lIFdNODQwMF9EQzFfQUNUX0xJTSAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIERDMV9BQ1RfTElNICovCisjZGVmaW5lIFdNODQwMF9EQzFfQUNUX0xJTV9NQVNLICAgICAgICAgICAgICAgICAweDAwODAgIC8qIERDMV9BQ1RfTElNICovCisjZGVmaW5lIFdNODQwMF9EQzFfQUNUX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDcgIC8qIERDMV9BQ1RfTElNICovCisjZGVmaW5lIFdNODQwMF9EQzFfQUNUX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMV9BQ1RfTElNICovCisjZGVmaW5lIFdNODQwMF9EQzFfVklNR19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YgIC8qIERDMV9WSU1HIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMV9WSU1HX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogREMxX1ZJTUcgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfREMxX1ZJTUdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBEQzFfVklNRyAtIFs2OjBdICovCisKKy8qCisgKiBSNzIgKDB4NDgpIC0gRENEQzIgQ29udHJvbCAxCisgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogREMyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREMyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBEQzJfRU5BICovCisjZGVmaW5lIFdNODQwMF9EQzJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIERDMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREMyX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBEQzJfQUNUSVZFICovCisjZGVmaW5lIFdNODQwMF9EQzJfQUNUSVZFX01BU0sgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIERDMl9BQ1RJVkUgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9BQ1RJVkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNCAgLyogREMyX0FDVElWRSAqLworI2RlZmluZSBXTTg0MDBfREMyX0FDVElWRV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfQUNUSVZFICovCisjZGVmaW5lIFdNODQwMF9EQzJfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIERDMl9TTEVFUCAqLworI2RlZmluZSBXTTg0MDBfREMyX1NMRUVQX01BU0sgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQzJfU0xFRVAgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9TTEVFUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogREMyX1NMRUVQICovCisjZGVmaW5lIFdNODQwMF9EQzJfU0xFRVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMl9TTEVFUCAqLworI2RlZmluZSBXTTg0MDBfREMyX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBEQzJfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9PUEZMVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogREMyX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9EQzJfT1BGTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIERDMl9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfREMyX09QRkxUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9FUlJBQ1QgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREMyX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfREMyX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBEQzJfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9EQzJfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIERDMl9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9FUlJBQ1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfREMyX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBEQzJfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogREMyX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9EQzJfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgMTAgIC8qIERDMl9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREMyX0hJQl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9TT0ZUU1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDMwMCAgLyogREMyX1NPRlRTVCAtIFs5OjhdICovCisjZGVmaW5lIFdNODQwMF9EQzJfU09GVFNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERDMl9TT0ZUU1QgLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMyX1NPRlRTVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAyICAvKiBEQzJfU09GVFNUIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9PVl9QUk9UICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogREMyX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9PVl9QUk9UX01BU0sgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogREMyX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9PVl9QUk9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNyAgLyogREMyX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9PVl9QUk9UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogREMyX1ZTRUwgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfREMyX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQzJfVlNFTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9EQzJfVlNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIERDMl9WU0VMIC0gWzY6MF0gKi8KKworLyoKKyAqIFI3MyAoMHg0OSkgLSBEQ0RDMiBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTg0MDBfREMyX0ZSQ19QV00gICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQzJfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMyX0ZSQ19QV01fTUFTSyAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQzJfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMyX0ZSQ19QV01fU0hJRlQgICAgICAgICAgICAgICAgICAgIDEzICAvKiBEQzJfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMyX0ZSQ19QV01fV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMyX1NUQllfTElNX01BU0sgICAgICAgICAgICAgICAgMHgwMzAwICAvKiBEQzJfU1RCWV9MSU0gLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMyX1NUQllfTElNX1NISUZUICAgICAgICAgICAgICAgICAgICA4ICAvKiBEQzJfU1RCWV9MSU0gLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMyX1NUQllfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgICAyICAvKiBEQzJfU1RCWV9MSU0gLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMyX0FDVF9MSU0gICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQzJfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMyX0FDVF9MSU1fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQzJfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMyX0FDVF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgICA3ICAvKiBEQzJfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMyX0FDVF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMyX1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBEQzJfVklNRyAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9EQzJfVklNR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERDMl9WSU1HIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9WSU1HX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogREMyX1ZJTUcgLSBbNjowXSAqLworCisvKgorICogUjc1ICgweDRCKSAtIEludGVyZmFjZQorICovCisjZGVmaW5lIFdNODQwMF9BVVRPSU5DICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFVVE9JTkMgKi8KKyNkZWZpbmUgV004NDAwX0FVVE9JTkNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQVVUT0lOQyAqLworI2RlZmluZSBXTTg0MDBfQVVUT0lOQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBVVRPSU5DICovCisjZGVmaW5lIFdNODQwMF9BVVRPSU5DX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFVVE9JTkMgKi8KKyNkZWZpbmUgV004NDAwX0FSQV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQVJBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQVJBX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBUkFfRU5BICovCisjZGVmaW5lIFdNODQwMF9BUkFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFSQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FSQV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQVJBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfU1BJX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBTUElfQ0ZHICovCisjZGVmaW5lIFdNODQwMF9TUElfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFNQSV9DRkcgKi8KKyNkZWZpbmUgV004NDAwX1NQSV9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BJX0NGRyAqLworI2RlZmluZSBXTTg0MDBfU1BJX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUElfQ0ZHICovCisKKy8qCisgKiBSNzYgKDB4NEMpIC0gUE0gR0VORVJBTAorICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TT0ZUU1QgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIENPREVDX1NPRlRTVCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU09GVFNUX01BU0sgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDT0RFQ19TT0ZUU1QgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX1NPRlRTVF9TSElGVCAgICAgICAgICAgICAgICAgICAxNSAgLyogQ09ERUNfU09GVFNUICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TT0ZUU1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIENPREVDX1NPRlRTVCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU09GVFNEICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBDT0RFQ19TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX1NPRlRTRF9NQVNLICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogQ09ERUNfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TT0ZUU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgMTQgIC8qIENPREVDX1NPRlRTRCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU09GVFNEX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBDT0RFQ19TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfU09GVFNEICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQ0hJUF9TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfU09GVFNEX01BU0sgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQ0hJUF9TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfU09GVFNEX1NISUZUICAgICAgICAgICAgICAgICAgICAxMyAgLyogQ0hJUF9TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfU09GVFNEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0hJUF9TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDFfUE9MICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRFNMRUVQMV9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDFfUE9MX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRFNMRUVQMV9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDFfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgMyAgLyogRFNMRUVQMV9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDFfUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNMRUVQMV9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDJfUE9MICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRFNMRUVQMl9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDJfUE9MX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRFNMRUVQMl9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDJfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogRFNMRUVQMl9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0RTTEVFUDJfUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNMRUVQMl9QT0wgKi8KKyNkZWZpbmUgV004NDAwX1BXUl9TVEFURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogUFdSX1NUQVRFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NDAwX1BXUl9TVEFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUFdSX1NUQVRFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NDAwX1BXUl9TVEFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUFdSX1NUQVRFIC0gWzE6MF0gKi8KKworLyoKKyAqIFI3OCAoMHg0RSkgLSBQTSBTaHV0ZG93biBDb250cm9sCisgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxNTBfRVJSQUNUICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogQ0hJUF9HVDE1MF9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxNTBfRVJSQUNUX01BU0sgICAgICAgICAgIDB4MDIwMCAgLyogQ0hJUF9HVDE1MF9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxNTBfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgOSAgLyogQ0hJUF9HVDE1MF9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxNTBfRVJSQUNUX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQ0hJUF9HVDE1MF9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxMTVfRVJSQUNUICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQ0hJUF9HVDExNV9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxMTVfRVJSQUNUX01BU0sgICAgICAgICAgIDB4MDEwMCAgLyogQ0hJUF9HVDExNV9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxMTVfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgOCAgLyogQ0hJUF9HVDExNV9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxMTVfRVJSQUNUX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQ0hJUF9HVDExNV9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0VSUkFDVCAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTElORV9DTVBfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAweDAwODAgIC8qIExJTkVfQ01QX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICA3ICAvKiBMSU5FX0NNUF9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogTElORV9DTVBfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9VVkxPX0VSUkFDVCAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFVWTE9fRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9VVkxPX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFVWTE9fRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9VVkxPX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFVWTE9fRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9VVkxPX0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFVWTE9fRVJSQUNUICovCisKKy8qCisgKiBSNzkgKDB4NEYpIC0gSW50ZXJydXB0IFN0YXR1cyAxCisgKi8KKyNkZWZpbmUgV004NDAwX01JQ0RfQ0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTUlDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9NSUNEX0NJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE1JQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfTUlDRF9DSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBNSUNEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX01JQ0RfQ0lOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9NSUNTQ0RfQ0lOVCAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIE1JQ1NDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9NSUNTQ0RfQ0lOVF9NQVNLICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIE1JQ1NDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9NSUNTQ0RfQ0lOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTQgIC8qIE1JQ1NDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9NSUNTQ0RfQ0lOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ1NDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRExfQ0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEpETF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRExfQ0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEpETF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRExfQ0lOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEpETF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRExfQ0lOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEpETF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRFJfQ0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEpEUl9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRFJfQ0lOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEpEUl9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRFJfQ0lOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIEpEUl9DSU5UICovCisjZGVmaW5lIFdNODQwMF9KRFJfQ0lOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEpEUl9DSU5UICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TRVFfRU5EX0VJTlQgICAgICAgICAgICAgICAweDA4MDAgIC8qIENPREVDX1NFUV9FTkRfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU0VRX0VORF9FSU5UX01BU0sgICAgICAgICAgMHgwODAwICAvKiBDT0RFQ19TRVFfRU5EX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX1NFUV9FTkRfRUlOVF9TSElGVCAgICAgICAgICAgICAxMSAgLyogQ09ERUNfU0VRX0VORF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TRVFfRU5EX0VJTlRfV0lEVEggICAgICAgICAgICAgIDEgIC8qIENPREVDX1NFUV9FTkRfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0RFTF9UT19FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBDREVMX1RPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NERUxfVE9fRUlOVF9NQVNLICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogQ0RFTF9UT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9DREVMX1RPX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMTAgIC8qIENERUxfVE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0RFTF9UT19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBDREVMX1RPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxNTBfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogQ0hJUF9HVDE1MF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0VJTlRfTUFTSyAgICAgICAgICAgICAweDAyMDAgIC8qIENISVBfR1QxNTBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDE1MF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICA5ICAvKiBDSElQX0dUMTUwX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxNTBfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQ0hJUF9HVDE1MF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0VJTlQgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIENISVBfR1QxMTVfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDExNV9FSU5UX01BU0sgICAgICAgICAgICAgMHgwMTAwICAvKiBDSElQX0dUMTE1X0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxMTVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgOCAgLyogQ0hJUF9HVDExNV9FSU5UICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIENISVBfR1QxMTVfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5FX0NNUF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9FSU5UX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIExJTkVfQ01QX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogTElORV9DTVBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBMSU5FX0NNUF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9VVkxPX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFVWTE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBVVkxPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX1VWTE9fRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogVVZMT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9VVkxPX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFVWTE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMyX1VWX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEQzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMyX1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEQzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMyX1VWX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1ICAvKiBEQzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMyX1VWX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMxX1VWX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEQzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMxX1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEQzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMxX1VWX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0ICAvKiBEQzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfREMxX1VWX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9VVl9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBMRE80X1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVVZfRUlOVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTERPNF9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE80X1VWX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDMgIC8qIExETzRfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE80X1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVVZfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTERPM19VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExETzNfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPM19VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAyICAvKiBMRE8zX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPM19VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1VWX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExETzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9VVl9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMRE8yX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfVVZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1VWX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9VVl9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMRE8xX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVVZfRUlOVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTERPMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1VWX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIExETzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8xX1VWX0VJTlQgKi8KKworLyoKKyAqIFI4MCAoMHg1MCkgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzaworICovCisjZGVmaW5lIFdNODQwMF9JTV9NSUNEX0NJTlQgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIElNX01JQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTUlDRF9DSU5UX01BU0sgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBJTV9NSUNEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX01JQ0RfQ0lOVF9TSElGVCAgICAgICAgICAgICAgICAgICAxNSAgLyogSU1fTUlDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9NSUNEX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX01JQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTUlDU0NEX0NJTlQgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBJTV9NSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTUlDU0NEX0NJTlRfTUFTSyAgICAgICAgICAgICAgMHg0MDAwICAvKiBJTV9NSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTUlDU0NEX0NJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDE0ICAvKiBJTV9NSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTUlDU0NEX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBJTV9NSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRMX0NJTlQgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTV9KRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRMX0NJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTV9KRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRMX0NJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEzICAvKiBJTV9KRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRMX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9KRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRSX0NJTlQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBJTV9KRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRSX0NJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBJTV9KRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRSX0NJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEyICAvKiBJTV9KRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fSkRSX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9KRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ09ERUNfU0VRX0VORF9FSU5UICAgICAgICAgICAgMHgwODAwICAvKiBJTV9DT0RFQ19TRVFfRU5EX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NPREVDX1NFUV9FTkRfRUlOVF9NQVNLICAgICAgIDB4MDgwMCAgLyogSU1fQ09ERUNfU0VRX0VORF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DT0RFQ19TRVFfRU5EX0VJTlRfU0hJRlQgICAgICAgICAgMTEgIC8qIElNX0NPREVDX1NFUV9FTkRfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ09ERUNfU0VRX0VORF9FSU5UX1dJRFRIICAgICAgICAgICAxICAvKiBJTV9DT0RFQ19TRVFfRU5EX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NERUxfVE9fRUlOVCAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogSU1fQ0RFTF9UT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DREVMX1RPX0VJTlRfTUFTSyAgICAgICAgICAgICAweDA0MDAgIC8qIElNX0NERUxfVE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0RFTF9UT19FSU5UX1NISUZUICAgICAgICAgICAgICAgIDEwICAvKiBJTV9DREVMX1RPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NERUxfVE9fRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogSU1fQ0RFTF9UT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DSElQX0dUMTUwX0VJTlQgICAgICAgICAgICAgICAweDAyMDAgIC8qIElNX0NISVBfR1QxNTBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0hJUF9HVDE1MF9FSU5UX01BU0sgICAgICAgICAgMHgwMjAwICAvKiBJTV9DSElQX0dUMTUwX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NISVBfR1QxNTBfRUlOVF9TSElGVCAgICAgICAgICAgICAgOSAgLyogSU1fQ0hJUF9HVDE1MF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DSElQX0dUMTUwX0VJTlRfV0lEVEggICAgICAgICAgICAgIDEgIC8qIElNX0NISVBfR1QxNTBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0hJUF9HVDExNV9FSU5UICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTV9DSElQX0dUMTE1X0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NISVBfR1QxMTVfRUlOVF9NQVNLICAgICAgICAgIDB4MDEwMCAgLyogSU1fQ0hJUF9HVDExNV9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DSElQX0dUMTE1X0VJTlRfU0hJRlQgICAgICAgICAgICAgIDggIC8qIElNX0NISVBfR1QxMTVfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0hJUF9HVDExNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAxICAvKiBJTV9DSElQX0dUMTE1X0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xJTkVfQ01QX0VJTlQgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU1fTElORV9DTVBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTElORV9DTVBfRUlOVF9NQVNLICAgICAgICAgICAgMHgwMDgwICAvKiBJTV9MSU5FX0NNUF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MSU5FX0NNUF9FSU5UX1NISUZUICAgICAgICAgICAgICAgIDcgIC8qIElNX0xJTkVfQ01QX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xJTkVfQ01QX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogSU1fTElORV9DTVBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fVVZMT19FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBJTV9VVkxPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX1VWTE9fRUlOVF9NQVNLICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU1fVVZMT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9VVkxPX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDYgIC8qIElNX1VWTE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fVVZMT19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9VVkxPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMl9VVl9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU1fREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMl9VVl9FSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU1fREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMl9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgNSAgLyogSU1fREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMl9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogSU1fREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMV9VVl9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU1fREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMV9VVl9FSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU1fREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMV9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgNCAgLyogSU1fREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0RDMV9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogSU1fREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzRfVVZfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogSU1fTERPNF9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE80X1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAweDAwMDggIC8qIElNX0xETzRfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPNF9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAzICAvKiBJTV9MRE80X1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzRfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogSU1fTERPNF9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8zX1VWX0VJTlQgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIElNX0xETzNfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPM19VVl9FSU5UX01BU0sgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9MRE8zX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzNfVVZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgMiAgLyogSU1fTERPM19VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8zX1VWX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElNX0xETzNfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPMl9VVl9FSU5UICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBJTV9MRE8yX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzJfVVZfRUlOVF9NQVNLICAgICAgICAgICAgIDB4MDAwMiAgLyogSU1fTERPMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8yX1VWX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDEgIC8qIElNX0xETzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPMl9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBJTV9MRE8yX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzFfVVZfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU1fTERPMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8xX1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAweDAwMDEgIC8qIElNX0xETzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPMV9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBJTV9MRE8xX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzFfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogSU1fTERPMV9VVl9FSU5UICovCisKKy8qCisgKiBSODEgKDB4NTEpIC0gSW50ZXJydXB0IExldmVscworICovCisjZGVmaW5lIFdNODQwMF9NSUNEX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE1JQ0RfTFZMICovCisjZGVmaW5lIFdNODQwMF9NSUNEX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE1JQ0RfTFZMICovCisjZGVmaW5lIFdNODQwMF9NSUNEX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIE1JQ0RfTFZMICovCisjZGVmaW5lIFdNODQwMF9NSUNEX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfTFZMICovCisjZGVmaW5lIFdNODQwMF9NSUNTQ0RfTFZMICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIE1JQ1NDRF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX01JQ1NDRF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTUlDU0NEX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTUlDU0NEX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBNSUNTQ0RfTFZMICovCisjZGVmaW5lIFdNODQwMF9NSUNTQ0RfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ1NDRF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0pETF9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSkRMX0xWTCAqLworI2RlZmluZSBXTTg0MDBfSkRMX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBKRExfTFZMICovCisjZGVmaW5lIFdNODQwMF9KRExfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEpETF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0pETF9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSkRMX0xWTCAqLworI2RlZmluZSBXTTg0MDBfSkRSX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBKRFJfTFZMICovCisjZGVmaW5lIFdNODQwMF9KRFJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEpEUl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0pEUl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogSkRSX0xWTCAqLworI2RlZmluZSBXTTg0MDBfSkRSX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBKRFJfTFZMICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TRVFfRU5EX0xWTCAgICAgICAgICAgICAgICAweDA4MDAgIC8qIENPREVDX1NFUV9FTkRfTFZMICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TRVFfRU5EX0xWTF9NQVNLICAgICAgICAgICAweDA4MDAgIC8qIENPREVDX1NFUV9FTkRfTFZMICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TRVFfRU5EX0xWTF9TSElGVCAgICAgICAgICAgICAgMTEgIC8qIENPREVDX1NFUV9FTkRfTFZMICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TRVFfRU5EX0xWTF9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIENPREVDX1NFUV9FTkRfTFZMICovCisjZGVmaW5lIFdNODQwMF9DREVMX1RPX0xWTCAgICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIENERUxfVE9fTFZMICovCisjZGVmaW5lIFdNODQwMF9DREVMX1RPX0xWTF9NQVNLICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIENERUxfVE9fTFZMICovCisjZGVmaW5lIFdNODQwMF9DREVMX1RPX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTAgIC8qIENERUxfVE9fTFZMICovCisjZGVmaW5lIFdNODQwMF9DREVMX1RPX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENERUxfVE9fTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0xWTCAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIENISVBfR1QxNTBfTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0xWTF9NQVNLICAgICAgICAgICAgICAweDAyMDAgIC8qIENISVBfR1QxNTBfTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgIDkgIC8qIENISVBfR1QxNTBfTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIENISVBfR1QxNTBfTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0xWTCAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIENISVBfR1QxMTVfTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0xWTF9NQVNLICAgICAgICAgICAgICAweDAxMDAgIC8qIENISVBfR1QxMTVfTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0xWTF9TSElGVCAgICAgICAgICAgICAgICAgIDggIC8qIENISVBfR1QxMTVfTFZMICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIENISVBfR1QxMTVfTFZMICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9MVkwgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJTkVfQ01QX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfTFZMX01BU0sgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5FX0NNUF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgNyAgLyogTElORV9DTVBfTFZMICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIExJTkVfQ01QX0xWTCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19MVkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBVVkxPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBVVkxPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBVVkxPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBVVkxPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfREMyX1VWX0xWTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEQzJfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9EQzJfVVZfTFZMX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERDMl9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9VVl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogREMyX1VWX0xWTCAqLworI2RlZmluZSBXTTg0MDBfREMyX1VWX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9EQzFfVVZfTFZMICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERDMV9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9VVl9MVkxfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogREMxX1VWX0xWTCAqLworI2RlZmluZSBXTTg0MDBfREMxX1VWX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBEQzFfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9EQzFfVVZfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMV9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVVZfTFZMICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTERPNF9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVVZfTFZMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTERPNF9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVVZfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgMyAgLyogTERPNF9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVVZfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPNF9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVVZfTFZMICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTERPM19VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVVZfTFZMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTERPM19VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVVZfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogTERPM19VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVVZfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPM19VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfVVZfTFZMICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERPMl9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfVVZfTFZMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERPMl9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfVVZfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfVVZfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVVZfTFZMICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTERPMV9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVVZfTFZMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTERPMV9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVVZfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogTERPMV9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVVZfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9VVl9MVkwgKi8KKworLyoKKyAqIFI4MiAoMHg1MikgLSBTaHV0ZG93biBSZWFzb24KKyAqLworI2RlZmluZSBXTTg0MDBfU0RSX0NISVBfU09GVFNEICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBTRFJfQ0hJUF9TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX1NPRlRTRF9NQVNLICAgICAgICAgICAgIDB4MjAwMCAgLyogU0RSX0NISVBfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9TT0ZUU0RfU0hJRlQgICAgICAgICAgICAgICAgMTMgIC8qIFNEUl9DSElQX1NPRlRTRCAqLworI2RlZmluZSBXTTg0MDBfU0RSX0NISVBfU09GVFNEX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBTRFJfQ0hJUF9TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9OUEROICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogU0RSX05QRE4gKi8KKyNkZWZpbmUgV004NDAwX1NEUl9OUEROX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogU0RSX05QRE4gKi8KKyNkZWZpbmUgV004NDAwX1NEUl9OUEROX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogU0RSX05QRE4gKi8KKyNkZWZpbmUgV004NDAwX1NEUl9OUEROX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX05QRE4gKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTUwICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogU0RSX0NISVBfR1QxNTAgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTUwX01BU0sgICAgICAgICAgICAgIDB4MDIwMCAgLyogU0RSX0NISVBfR1QxNTAgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTUwX1NISUZUICAgICAgICAgICAgICAgICAgOSAgLyogU0RSX0NISVBfR1QxNTAgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTUwX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0NISVBfR1QxNTAgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTE1ICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogU0RSX0NISVBfR1QxMTUgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTE1X01BU0sgICAgICAgICAgICAgIDB4MDEwMCAgLyogU0RSX0NISVBfR1QxMTUgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTE1X1NISUZUICAgICAgICAgICAgICAgICAgOCAgLyogU0RSX0NISVBfR1QxMTUgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX0dUMTE1X1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0NISVBfR1QxMTUgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MSU5FX0NNUCAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogU0RSX0xJTkVfQ01QICovCisjZGVmaW5lIFdNODQwMF9TRFJfTElORV9DTVBfTUFTSyAgICAgICAgICAgICAgICAweDAwODAgIC8qIFNEUl9MSU5FX0NNUCAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xJTkVfQ01QX1NISUZUICAgICAgICAgICAgICAgICAgICA3ICAvKiBTRFJfTElORV9DTVAgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MSU5FX0NNUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0xJTkVfQ01QICovCisjZGVmaW5lIFdNODQwMF9TRFJfVVZMTyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNEUl9VVkxPICovCisjZGVmaW5lIFdNODQwMF9TRFJfVVZMT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNEUl9VVkxPICovCisjZGVmaW5lIFdNODQwMF9TRFJfVVZMT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFNEUl9VVkxPICovCisjZGVmaW5lIFdNODQwMF9TRFJfVVZMT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNEUl9VVkxPICovCisjZGVmaW5lIFdNODQwMF9TRFJfREMyX1VWICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFNEUl9EQzJfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9EQzJfVVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogU0RSX0RDMl9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0RDMl9VVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBTRFJfREMyX1VWICovCisjZGVmaW5lIFdNODQwMF9TRFJfREMyX1VWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNEUl9EQzJfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9EQzFfVVYgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogU0RSX0RDMV9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0RDMV9VVl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBTRFJfREMxX1VWICovCisjZGVmaW5lIFdNODQwMF9TRFJfREMxX1VWX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFNEUl9EQzFfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9EQzFfVVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0RDMV9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzRfVVYgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBTRFJfTERPNF9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzRfVVZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBTRFJfTERPNF9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzRfVVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzICAvKiBTRFJfTERPNF9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzRfVVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBTRFJfTERPNF9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzNfVVYgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBTRFJfTERPM19VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzNfVVZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBTRFJfTERPM19VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzNfVVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyICAvKiBTRFJfTERPM19VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzNfVVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBTRFJfTERPM19VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzJfVVYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBTRFJfTERPMl9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzJfVVZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBTRFJfTERPMl9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzJfVVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBTRFJfTERPMl9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzJfVVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBTRFJfTERPMl9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzFfVVYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTRFJfTERPMV9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzFfVVZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTRFJfTERPMV9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzFfVVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBTRFJfTERPMV9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xETzFfVVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBTRFJfTERPMV9VViAqLworCisvKgorICogUjg0ICgweDU0KSAtIExpbmUgQ2lyY3VpdHMKKyAqLworI2RlZmluZSBXTTg0MDBfQkdfTElORV9DT01QICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBCR19MSU5FX0NPTVAgKi8KKyNkZWZpbmUgV004NDAwX0JHX0xJTkVfQ09NUF9NQVNLICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQkdfTElORV9DT01QICovCisjZGVmaW5lIFdNODQwMF9CR19MSU5FX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgMTUgIC8qIEJHX0xJTkVfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfQkdfTElORV9DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBCR19MSU5FX0NPTVAgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX1ZUSElfTUFTSyAgICAgICAgICAgICAgIDB4MDBGMCAgLyogTElORV9DTVBfVlRISSAtIFs3OjRdICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9WVEhJX1NISUZUICAgICAgICAgICAgICAgICAgIDQgIC8qIExJTkVfQ01QX1ZUSEkgLSBbNzo0XSAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfVlRISV9XSURUSCAgICAgICAgICAgICAgICAgICA0ICAvKiBMSU5FX0NNUF9WVEhJIC0gWzc6NF0gKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX1ZUSERfTUFTSyAgICAgICAgICAgICAgIDB4MDAwRiAgLyogTElORV9DTVBfVlRIRCAtIFszOjBdICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9WVEhEX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIExJTkVfQ01QX1ZUSEQgLSBbMzowXSAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfVlRIRF9XSURUSCAgICAgICAgICAgICAgICAgICA0ICAvKiBMSU5FX0NNUF9WVEhEIC0gWzM6MF0gKi8KKwordTE2IHdtODQwMF9yZWdfcmVhZChzdHJ1Y3Qgd204NDAwICp3bTg0MDAsIHU4IHJlZyk7CitpbnQgd204NDAwX2Jsb2NrX3JlYWQoc3RydWN0IHdtODQwMCAqd204NDAwLCB1OCByZWcsIGludCBjb3VudCwgdTE2ICpkYXRhKTsKK2ludCB3bTg0MDBfc2V0X2JpdHMoc3RydWN0IHdtODQwMCAqd204NDAwLCB1OCByZWcsIHUxNiBtYXNrLCB1MTYgdmFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTg0MDAuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODQwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmI1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTg0MDAuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogd204NDAwIGNsaWVudCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9XTTg0MDBfSAorI2RlZmluZSBfX0xJTlVYX01GRF9XTTg0MDBfSAorCisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKworI2RlZmluZSBXTTg0MDBfTERPMSAgMAorI2RlZmluZSBXTTg0MDBfTERPMiAgMQorI2RlZmluZSBXTTg0MDBfTERPMyAgMgorI2RlZmluZSBXTTg0MDBfTERPNCAgMworI2RlZmluZSBXTTg0MDBfRENEQzEgNAorI2RlZmluZSBXTTg0MDBfRENEQzIgNQorCitzdHJ1Y3Qgd204NDAwX3BsYXRmb3JtX2RhdGEgeworCWludCAoKnBsYXRmb3JtX2luaXQpKHN0cnVjdCBkZXZpY2UgKmRldik7Cit9OworCitpbnQgd204NDAwX3JlZ2lzdGVyX3JlZ3VsYXRvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsCisJCQkgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdGRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCmluZGV4IDM0ODFhN2QuLmQ2YTNmNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaApAQCAtMTMxLDYgKzEzMSwxNiBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUwkweDAxMDAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfUFJPVE9DT0wJMHgwMjAwCiAKKyNkZWZpbmUgSElEX0FOWV9JRAkJCQkofjApCisKK3N0cnVjdCBoaWRfZGV2aWNlX2lkIHsKKwlfX3UxNiBidXM7CisJX191MzIgdmVuZG9yOworCV9fdTMyIHByb2R1Y3Q7CisJa2VybmVsX3Vsb25nX3QgZHJpdmVyX2RhdGEKKwkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2Yoa2VybmVsX3Vsb25nX3QpKSkpOworfTsKKwogLyogczM5MCBDQ1cgZGV2aWNlcyAqLwogc3RydWN0IGNjd19kZXZpY2VfaWQgewogCV9fdTE2CW1hdGNoX2ZsYWdzOwkvKiB3aGljaCBmaWVsZHMgdG8gbWF0Y2ggYWdhaW5zdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggZDNlYTNkZS4uNjQ4NzU4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0xMSw3ICsxMSw3IEBACiAgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CiAgKgkJQ29yZXkgTWlueWFyZCA8d2YtcmNoIW1pbnlhcmRAcmVsYXkuRVUubmV0PgogICoJCURvbmFsZCBKLiBCZWNrZXIsIDxiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3Y+Ci0gKgkJQWxhbiBDb3gsIDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkJQmpvcm4gRWt3YWxsLiA8Ymowcm5AYmxveC5zZT4KICAqICAgICAgICAgICAgICBQZWtrYSBSaWlrb25lbiA8cHJpaWtvbmVAcG9zZWlkb24ucHNwdC5maT4KICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAppbmRleCAxMDhmNDdlLi4yMTI2OTQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgTkZTRF9NQVlfTE9DSwkJMzIKICNkZWZpbmUgTkZTRF9NQVlfT1dORVJfT1ZFUlJJREUJNjQKICNkZWZpbmUgTkZTRF9NQVlfTE9DQUxfQUNDRVNTCTEyOCAvKiBJUklYIGRvaW5nIGxvY2FsIGFjY2VzcyBjaGVjayBvbiBkZXZpY2Ugc3BlY2lhbCBmaWxlKi8KKyNkZWZpbmUgTkZTRF9NQVlfQllQQVNTX0dTU19PTl9ST09UIDI1NgogCiAjZGVmaW5lIE5GU0RfTUFZX0NSRUFURQkJKE5GU0RfTUFZX0VYRUN8TkZTRF9NQVlfV1JJVEUpCiAjZGVmaW5lIE5GU0RfTUFZX1JFTU9WRQkJKE5GU0RfTUFZX0VYRUN8TkZTRF9NQVlfV1JJVEV8TkZTRF9NQVlfVFJVTkMpCkBAIC0xMjUsNyArMTI2LDcgQEAKIF9fYmUzMgkJbmZzZF9yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkgICAgIGxvZmZfdCAqLCBzdHJ1Y3QgcmVhZGRpcl9jZCAqLCBmaWxsZGlyX3QpOwogX19iZTMyCQluZnNkX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAotCQkJCXN0cnVjdCBrc3RhdGZzICopOworCQkJCXN0cnVjdCBrc3RhdGZzICosIGludCBhY2Nlc3MpOwogCiBpbnQJCW5mc2Rfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOwogX19iZTMyCQluZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZXhwb3J0ICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bmbi5oIGIvaW5jbHVkZS9saW51eC9wZm4uaAppbmRleCBiYjAxZjhiLi43NjQ2NjM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bmbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcGZuLmgKQEAgLTEsOSArMSwxMyBAQAogI2lmbmRlZiBfTElOVVhfUEZOX0hfCiAjZGVmaW5lIF9MSU5VWF9QRk5fSF8KIAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2VuZGlmCisKICNkZWZpbmUgUEZOX0FMSUdOKHgpCSgoKHVuc2lnbmVkIGxvbmcpKHgpICsgKFBBR0VfU0laRSAtIDEpKSAmIFBBR0VfTUFTSykKICNkZWZpbmUgUEZOX1VQKHgpCSgoKHgpICsgUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQpCiAjZGVmaW5lIFBGTl9ET1dOKHgpCSgoeCkgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgUEZOX1BIWVMoeCkJKCh4KSA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQRk5fUEhZUyh4KQkoKHBoeXNfYWRkcl90KSh4KSA8PCBQQUdFX1NISUZUKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKaW5kZXggMWQ3MTJjNy4uZTM3ZDgwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKQEAgLTE4LDggKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KIAotc3RydWN0IHJlZ3VsYXRvcl9jb25zdHJhaW50czsKIHN0cnVjdCByZWd1bGF0b3JfZGV2Oworc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGE7CiAKIC8qKgogICogc3RydWN0IHJlZ3VsYXRvcl9vcHMgLSByZWd1bGF0b3Igb3BlcmF0aW9ucy4KQEAgLTUxLDcgKzUxLDcgQEAKIAkJCQkJICBpbnQgb3V0cHV0X3VWLCBpbnQgbG9hZF91QSk7CiAKIAkvKiB0aGUgb3BlcmF0aW9ucyBiZWxvdyBhcmUgZm9yIGNvbmZpZ3VyYXRpb24gb2YgcmVndWxhdG9yIHN0YXRlIHdoZW4KLQkgKiBpdCdzIHBhcmVudCBQTUlDIGVudGVycyBhIGdsb2JhbCBTVEFOQlkvSElCRVJOQVRFIHN0YXRlICovCisJICogaXRzIHBhcmVudCBQTUlDIGVudGVycyBhIGdsb2JhbCBTVEFOREJZL0hJQkVSTkFURSBzdGF0ZSAqLwogCiAJLyogc2V0IHJlZ3VsYXRvciBzdXNwZW5kIHZvbHRhZ2UgKi8KIAlpbnQgKCpzZXRfc3VzcGVuZF92b2x0YWdlKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwgaW50IHVWKTsKQEAgLTg1LDE1ICs4NSwxNyBAQAogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogfTsKIAotCiBzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVndWxhdG9yX3JlZ2lzdGVyKHN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmVndWxhdG9yX2Rlc2MsCi0JCQkJCSAgdm9pZCAqcmVnX2RhdGEpOworCXN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZHJpdmVyX2RhdGEpOwogdm9pZCByZWd1bGF0b3JfdW5yZWdpc3RlcihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CiAKIGludCByZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpOwogCiB2b2lkICpyZGV2X2dldF9kcnZkYXRhKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKK3N0cnVjdCBkZXZpY2UgKnJkZXZfZ2V0X2RldihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CiBpbnQgcmRldl9nZXRfaWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOwogCit2b2lkICpyZWd1bGF0b3JfZ2V0X2luaXRfZHJ2ZGF0YShzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2luaXRfZGF0YSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCmluZGV4IDExZTczN2QuLmM2ZDY5MzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmgKQEAgLTg5LDE1ICs4OSwzMyBAQAogCXVuc2lnbmVkIGFwcGx5X3VWOjE7CS8qIGFwcGx5IHVWIGNvbnN0cmFpbnQgaWZmIG1pbiA9PSBtYXggKi8KIH07CiAKLWludCByZWd1bGF0b3Jfc2V0X3N1cHBseShjb25zdCBjaGFyICpyZWd1bGF0b3IsIGNvbnN0IGNoYXIgKnJlZ3VsYXRvcl9zdXBwbHkpOworLyoqCisgKiBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSAtIHN1cHBseSAtPiBkZXZpY2UgbWFwcGluZworICoKKyAqIFRoaXMgbWFwcyBhIHN1cHBseSBuYW1lIHRvIGEgZGV2aWNlLgorICovCitzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB7CisJc3RydWN0IGRldmljZSAqZGV2OwkvKiBjb25zdW1lciAqLworCWNvbnN0IGNoYXIgKnN1cHBseTsJLyogY29uc3VtZXIgc3VwcGx5IC0gZS5nLiAidmNjIiAqLworfTsKIAotY29uc3QgY2hhciAqcmVndWxhdG9yX2dldF9zdXBwbHkoY29uc3QgY2hhciAqcmVndWxhdG9yKTsKKy8qKgorICogc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgLSByZWd1bGF0b3IgcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gZGF0YS4KKyAqCisgKiBJbml0aWFsaXNhdGlvbiBjb25zdHJhaW50cywgb3VyIHN1cHBseSBhbmQgY29uc3VtZXJzIHN1cHBsaWVzLgorICovCitzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB7CisJc3RydWN0IGRldmljZSAqc3VwcGx5X3JlZ3VsYXRvcl9kZXY7IC8qIG9yIE5VTEwgZm9yIExJTkUgKi8KIAotaW50IHJlZ3VsYXRvcl9zZXRfbWFjaGluZV9jb25zdHJhaW50cyhjb25zdCBjaGFyICpyZWd1bGF0b3IsCi0Jc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzKTsKKwlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyBjb25zdHJhaW50czsKIAotaW50IHJlZ3VsYXRvcl9zZXRfZGV2aWNlX3N1cHBseShjb25zdCBjaGFyICpyZWd1bGF0b3IsIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQljb25zdCBjaGFyICpzdXBwbHkpOworCWludCBudW1fY29uc3VtZXJfc3VwcGxpZXM7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgKmNvbnN1bWVyX3N1cHBsaWVzOworCisJLyogb3B0aW9uYWwgcmVndWxhdG9yIG1hY2hpbmUgc3BlY2lmaWMgaW5pdCAqLworCWludCAoKnJlZ3VsYXRvcl9pbml0KSh2b2lkICpkcml2ZXJfZGF0YSk7CisJdm9pZCAqZHJpdmVyX2RhdGE7CS8qIGNvcmUgZG9lcyBub3QgdG91Y2ggdGhpcyAqLworfTsKIAogaW50IHJlZ3VsYXRvcl9zdXNwZW5kX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCmluZGV4IGU1YmZlMDEuLjZmMGVlMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogCWNvbnN0IHN0cnVjdCBycGNfdGltZW91dCAqdGltZW91dDsKIAljaGFyCQkJKnNlcnZlcm5hbWU7CiAJc3RydWN0IHJwY19wcm9ncmFtCSpwcm9ncmFtOworCXUzMgkJCXByb2dudW1iZXI7CS8qIG92ZXJyaWRlcyBwcm9ncmFtLT5udW1iZXIgKi8KIAl1MzIJCQl2ZXJzaW9uOwogCXJwY19hdXRoZmxhdm9yX3QJYXV0aGZsYXZvcjsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKQEAgLTEyNCwxMCArMTI1LDEwIEBACiB2b2lkCQlycGNfc2h1dGRvd25fY2xpZW50KHN0cnVjdCBycGNfY2xudCAqKTsKIHZvaWQJCXJwY19yZWxlYXNlX2NsaWVudChzdHJ1Y3QgcnBjX2NsbnQgKik7CiAKLWludAkJcnBjYl9yZWdpc3Rlcih1MzIsIHUzMiwgaW50LCB1bnNpZ25lZCBzaG9ydCwgaW50ICopOworaW50CQlycGNiX3JlZ2lzdGVyKHUzMiwgdTMyLCBpbnQsIHVuc2lnbmVkIHNob3J0KTsKIGludAkJcnBjYl92NF9yZWdpc3Rlcihjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCiAJCQkJIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcywKLQkJCQkgY29uc3QgY2hhciAqbmV0aWQsIGludCAqcmVzdWx0KTsKKwkJCQkgY29uc3QgY2hhciAqbmV0aWQpOwogaW50CQlycGNiX2dldHBvcnRfc3luYyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwgdTMyLCB1MzIsIGludCk7CiB2b2lkCQlycGNiX2dldHBvcnRfYXN5bmMoc3RydWN0IHJwY190YXNrICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IGRjNjkwNjguLjNhZmU3ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC02Niw2ICs2Niw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlzdl90ZW1wc29ja3M7CS8qIGFsbCB0ZW1wb3Jhcnkgc29ja2V0cyAqLwogCWludAkJCXN2X3RtcGNudDsJLyogY291bnQgb2YgdGVtcG9yYXJ5IHNvY2tldHMgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdAlzdl90ZW1wdGltZXI7CS8qIHRpbWVyIGZvciBhZ2luZyB0ZW1wb3Jhcnkgc29ja2V0cyAqLworCXNhX2ZhbWlseV90CQlzdl9mYW1pbHk7CS8qIGxpc3RlbmVyJ3MgYWRkcmVzcyBmYW1pbHkgKi8KIAogCWNoYXIgKgkJCXN2X25hbWU7CS8qIHNlcnZpY2UgbmFtZSAqLwogCkBAIC0yNjUsMTcgKzI2NiwxNyBAQAogLyoKICAqIFJpZ29yb3VzIHR5cGUgY2hlY2tpbmcgb24gc29ja2FkZHIgdHlwZSBjb252ZXJzaW9ucwogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3ZjX2FkZHJfaW4oc3RydWN0IHN2Y19ycXN0ICpycXN0KQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnN2Y19hZGRyX2luKGNvbnN0IHN0cnVjdCBzdmNfcnFzdCAqcnFzdCkKIHsKIAlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnFzdC0+cnFfYWRkcjsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzdmNfYWRkcl9pbjYoc3RydWN0IHN2Y19ycXN0ICpycXN0KQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzdmNfYWRkcl9pbjYoY29uc3Qgc3RydWN0IHN2Y19ycXN0ICpycXN0KQogewogCXJldHVybiAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmcnFzdC0+cnFfYWRkcjsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKnN2Y19hZGRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyICpzdmNfYWRkcihjb25zdCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3QpCiB7CiAJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnJxc3QtPnJxX2FkZHI7CiB9CkBAIC0zODEsMTggKzM4MiwyMCBAQAogLyoKICAqIEZ1bmN0aW9uIHByb3RvdHlwZXMuCiAgKi8KLXN0cnVjdCBzdmNfc2VydiAqICBzdmNfY3JlYXRlKHN0cnVjdCBzdmNfcHJvZ3JhbSAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICB2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiopKTsKK3N0cnVjdCBzdmNfc2VydiAqc3ZjX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKiwgdW5zaWduZWQgaW50LCBzYV9mYW1pbHlfdCwKKwkJCSAgICB2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqKSk7CiBzdHJ1Y3Qgc3ZjX3Jxc3QgKnN2Y19wcmVwYXJlX3RocmVhZChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsCiAJCQkJCXN0cnVjdCBzdmNfcG9vbCAqcG9vbCk7CiB2b2lkCQkgICBzdmNfZXhpdF90aHJlYWQoc3RydWN0IHN2Y19ycXN0ICopOwogc3RydWN0IHN2Y19zZXJ2ICogIHN2Y19jcmVhdGVfcG9vbGVkKHN0cnVjdCBzdmNfcHJvZ3JhbSAqLCB1bnNpZ25lZCBpbnQsCi0JCQl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiopLCBzdmNfdGhyZWFkX2ZuLAotCQkJc3RydWN0IG1vZHVsZSAqKTsKKwkJCXNhX2ZhbWlseV90LCB2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqKSwKKwkJCXN2Y190aHJlYWRfZm4sIHN0cnVjdCBtb2R1bGUgKik7CiBpbnQJCSAgIHN2Y19zZXRfbnVtX3RocmVhZHMoc3RydWN0IHN2Y19zZXJ2ICosIHN0cnVjdCBzdmNfcG9vbCAqLCBpbnQpOwogdm9pZAkJICAgc3ZjX2Rlc3Ryb3koc3RydWN0IHN2Y19zZXJ2ICopOwogaW50CQkgICBzdmNfcHJvY2VzcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKik7Ci1pbnQJCSAgIHN2Y19yZWdpc3RlcihzdHJ1Y3Qgc3ZjX3NlcnYgKiwgaW50LCB1bnNpZ25lZCBzaG9ydCk7CitpbnQJCSAgIHN2Y19yZWdpc3Rlcihjb25zdCBzdHJ1Y3Qgc3ZjX3NlcnYgKiwgY29uc3QgdW5zaWduZWQgc2hvcnQsCisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQpOworCiB2b2lkCQkgICBzdmNfd2FrZV91cChzdHJ1Y3Qgc3ZjX3NlcnYgKik7CiB2b2lkCQkgICBzdmNfcmVzZXJ2ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgc3BhY2UpOwogc3RydWN0IHN2Y19wb29sICogIHN2Y19wb29sX2Zvcl9jcHUoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBpbnQgY3B1KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y19yZG1hLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfcmRtYS5oCmluZGV4IGRjMDViNTQuLmMxNGZlODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y19yZG1hLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjX3JkbWEuaApAQCAtNzIsNiArNzIsNyBAQAogICovCiBzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCB7CiAJc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKnJlYWRfaGRyOworCXN0cnVjdCBzdmNfcmRtYV9mYXN0cmVnX21yICpmcm1yOwogCWludCBoZHJfY291bnQ7CiAJc3RydWN0IHhkcl9idWYgYXJnOwogCXN0cnVjdCBsaXN0X2hlYWQgZHRvX3E7CkBAIC0xMDMsMTYgKzEwNCwzMCBAQAogCWludCBzdGFydDsJCS8qIHNnZSBubyBmb3IgdGhpcyBjaHVuayAqLwogCWludCBjb3VudDsJCS8qIHNnZSBjb3VudCBmb3IgdGhpcyBjaHVuayAqLwogfTsKK3N0cnVjdCBzdmNfcmRtYV9mYXN0cmVnX21yIHsKKwlzdHJ1Y3QgaWJfbXIgKm1yOworCXZvaWQgKmt2YTsKKwlzdHJ1Y3QgaWJfZmFzdF9yZWdfcGFnZV9saXN0ICpwYWdlX2xpc3Q7CisJaW50IHBhZ2VfbGlzdF9sZW47CisJdW5zaWduZWQgbG9uZyBhY2Nlc3NfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBtYXBfbGVuOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZybXJfbGlzdDsKK307CiBzdHJ1Y3Qgc3ZjX3JkbWFfcmVxX21hcCB7CisJc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXI7CiAJdW5zaWduZWQgbG9uZyBjb3VudDsKIAl1bmlvbiB7CiAJCXN0cnVjdCBrdmVjIHNnZVtSUENTVkNfTUFYUEFHRVNdOwogCQlzdHJ1Y3Qgc3ZjX3JkbWFfY2h1bmtfc2dlIGNoW1JQQ1NWQ19NQVhQQUdFU107CiAJfTsKIH07Ci0KKyNkZWZpbmUgUkRNQUNUWFRfRl9GQVNUX1VOUkVHCTEKICNkZWZpbmUgUkRNQUNUWFRfRl9MQVNUX0NUWFQJMgogCisjZGVmaW5lCVNWQ1JETUFfREVWQ0FQX0ZBU1RfUkVHCQkxCS8qIGZhc3QgbXIgcmVnaXN0cmF0aW9uICovCisjZGVmaW5lCVNWQ1JETUFfREVWQ0FQX1JFQURfV19JTlYJMgkvKiByZWFkIHcvIGludmFsaWRhdGUgKi8KKwogc3RydWN0IHN2Y3hwcnRfcmRtYSB7CiAJc3RydWN0IHN2Y194cHJ0ICAgICAgc2NfeHBydDsJCS8qIFNWQyB0cmFuc3BvcnQgc3RydWN0dXJlICovCiAJc3RydWN0IHJkbWFfY21faWQgICAgKnNjX2NtX2lkOwkJLyogUkRNQSBjb25uZWN0aW9uIGlkICovCkBAIC0xMzYsNiArMTUxLDExIEBACiAJc3RydWN0IGliX2NxICAgICAgICAgKnNjX3JxX2NxOwogCXN0cnVjdCBpYl9jcSAgICAgICAgICpzY19zcV9jcTsKIAlzdHJ1Y3QgaWJfbXIgICAgICAgICAqc2NfcGh5c19tcjsJLyogTVIgZm9yIHNlcnZlciBtZW1vcnkgKi8KKwl1MzIJCSAgICAgc2NfZGV2X2NhcHM7CS8qIGRpc3RpbGxlZCBkZXZpY2UgY2FwcyAqLworCXUzMgkJICAgICBzY19kbWFfbGtleTsJLyogbG9jYWwgZG1hIGtleSAqLworCXVuc2lnbmVkIGludAkgICAgIHNjX2ZybXJfcGdfbGlzdF9sZW47CisJc3RydWN0IGxpc3RfaGVhZCAgICAgc2NfZnJtcl9xOworCXNwaW5sb2NrX3QJICAgICBzY19mcm1yX3FfbG9jazsKIAogCXNwaW5sb2NrX3QJICAgICBzY19sb2NrOwkJLyogdHJhbnNwb3J0IGxvY2sgKi8KIApAQCAtMTkyLDggKzIxMiwxMyBAQAogZXh0ZXJuIGludCBzdmNfcmRtYV9jcmVhdGVfbGlzdGVuKHN0cnVjdCBzdmNfc2VydiAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciAqKTsKIGV4dGVybiBzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqc3ZjX3JkbWFfZ2V0X2NvbnRleHQoc3RydWN0IHN2Y3hwcnRfcmRtYSAqKTsKIGV4dGVybiB2b2lkIHN2Y19yZG1hX3B1dF9jb250ZXh0KHN0cnVjdCBzdmNfcmRtYV9vcF9jdHh0ICosIGludCk7CitleHRlcm4gdm9pZCBzdmNfcmRtYV91bm1hcF9kbWEoc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKmN0eHQpOwogZXh0ZXJuIHN0cnVjdCBzdmNfcmRtYV9yZXFfbWFwICpzdmNfcmRtYV9nZXRfcmVxX21hcCh2b2lkKTsKIGV4dGVybiB2b2lkIHN2Y19yZG1hX3B1dF9yZXFfbWFwKHN0cnVjdCBzdmNfcmRtYV9yZXFfbWFwICopOworZXh0ZXJuIGludCBzdmNfcmRtYV9mYXN0cmVnKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKiwgc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKik7CitleHRlcm4gc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKnN2Y19yZG1hX2dldF9mcm1yKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKik7CitleHRlcm4gdm9pZCBzdmNfcmRtYV9wdXRfZnJtcihzdHJ1Y3Qgc3ZjeHBydF9yZG1hICosCisJCQkgICAgICBzdHJ1Y3Qgc3ZjX3JkbWFfZmFzdHJlZ19tciAqKTsKIGV4dGVybiB2b2lkIHN2Y19zcV9yZWFwKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKik7CiBleHRlcm4gdm9pZCBzdmNfcnFfcmVhcChzdHJ1Y3Qgc3ZjeHBydF9yZG1hICopOwogZXh0ZXJuIHN0cnVjdCBzdmNfeHBydF9jbGFzcyBzdmNfcmRtYV9jbGFzczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y3NvY2suaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y3NvY2suaAppbmRleCA4Y2ZmNjk2Li40ODNlMTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNzb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3Zjc29jay5oCkBAIC0zOSwxMCArMzksNyBAQAogdm9pZAkJc3ZjX2Ryb3Aoc3RydWN0IHN2Y19ycXN0ICopOwogdm9pZAkJc3ZjX3NvY2tfdXBkYXRlX2J1ZnMoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KTsKIGludAkJc3ZjX3NvY2tfbmFtZXMoY2hhciAqYnVmLCBzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGNoYXIgKnRvY2xvc2UpOwotaW50CQlzdmNfYWRkc29jayhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsCi0JCQkgICAgaW50IGZkLAotCQkJICAgIGNoYXIgKm5hbWVfcmV0dXJuLAotCQkJICAgIGludCAqcHJvdG8pOworaW50CQlzdmNfYWRkc29jayhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGludCBmZCwgY2hhciAqbmFtZV9yZXR1cm4pOwogdm9pZAkJc3ZjX2luaXRfeHBydF9zb2NrKHZvaWQpOwogdm9pZAkJc3ZjX2NsZWFudXBfeHBydF9zb2NrKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKaW5kZXggZDRhOWNlNi4uZjI0ZjdiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMTkxLDEyICsxOTEsMTQgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiB0eXBlZGVmIHVuc2lnbmVkIF9fYml0d2lzZV9fIGdmcF90OwogCi0jaWZkZWYgQ09ORklHX1JFU09VUkNFU182NEJJVAotdHlwZWRlZiB1NjQgcmVzb3VyY2Vfc2l6ZV90OworI2lmZGVmIENPTkZJR19QSFlTX0FERFJfVF82NEJJVAordHlwZWRlZiB1NjQgcGh5c19hZGRyX3Q7CiAjZWxzZQotdHlwZWRlZiB1MzIgcmVzb3VyY2Vfc2l6ZV90OwordHlwZWRlZiB1MzIgcGh5c19hZGRyX3Q7CiAjZW5kaWYKIAordHlwZWRlZiBwaHlzX2FkZHJfdCByZXNvdXJjZV9zaXplX3Q7CisKIHN0cnVjdCB1c3RhdCB7CiAJX19rZXJuZWxfZGFkZHJfdAlmX3RmcmVlOwogCV9fa2VybmVsX2lub190CQlmX3Rpbm9kZTsKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzX21kLmMgYi9pbml0L2RvX21vdW50c19tZC5jCmluZGV4IDY5M2QyNDYuLjQ4YjNmYWQgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzX21kLmMKKysrIGIvaW5pdC9kb19tb3VudHNfbWQuYwpAQCAtMTIsNyArMTIsMTIgQEAKICAqIFRoZSBjb2RlIGZvciB0aGF0IGlzIGhlcmUuCiAgKi8KIAotc3RhdGljIGludCBfX2luaXRkYXRhIHJhaWRfbm9hdXRvZGV0ZWN0LCByYWlkX2F1dG9wYXJ0OworI2lmZGVmIENPTkZJR19NRF9BVVRPREVURUNUCitzdGF0aWMgaW50IF9faW5pdGRhdGEgcmFpZF9ub2F1dG9kZXRlY3Q7CisjZWxzZQorc3RhdGljIGludCBfX2luaXRkYXRhIHJhaWRfbm9hdXRvZGV0ZWN0PTE7CisjZW5kaWYKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSByYWlkX2F1dG9wYXJ0OwogCiBzdGF0aWMgc3RydWN0IHsKIAlpbnQgbWlub3I7CkBAIC0yNTIsNiArMjU3LDggQEAKIAogCQlpZiAoIXN0cm5jbXAoc3RyLCAibm9hdXRvZGV0ZWN0Iiwgd2xlbikpCiAJCQlyYWlkX25vYXV0b2RldGVjdCA9IDE7CisJCWlmICghc3RybmNtcChzdHIsICJhdXRvZGV0ZWN0Iiwgd2xlbikpCisJCQlyYWlkX25vYXV0b2RldGVjdCA9IDA7CiAJCWlmIChzdHJuY21wKHN0ciwgInBhcnRpdGlvbmFibGUiLCB3bGVuKT09MCkKIAkJCXJhaWRfYXV0b3BhcnQgPSAxOwogCQlpZiAoc3RybmNtcChzdHIsICJwYXJ0Iiwgd2xlbik9PTApCkBAIC0yNjQsMTcgKzI3MSwzMiBAQAogX19zZXR1cCgicmFpZD0iLCByYWlkX3NldHVwKTsKIF9fc2V0dXAoIm1kPSIsIG1kX3NldHVwKTsKIAorc3RhdGljIHZvaWQgYXV0b2RldGVjdF9yYWlkKHZvaWQpCit7CisJaW50IGZkOworCisJLyoKKwkgKiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIGRldGVjdCBhbmQgdXNlIGhhbGYgYSByYWlkIGFycmF5LCB3ZSBuZWVkIHRvCisJICogd2FpdCBmb3IgdGhlIGtub3duIGRldmljZXMgdG8gY29tcGxldGUgdGhlaXIgcHJvYmluZworCSAqLworCXByaW50ayhLRVJOX0lORk8gIm1kOiBXYWl0aW5nIGZvciBhbGwgZGV2aWNlcyB0byBiZSBhdmFpbGFibGUgYmVmb3JlIGF1dG9kZXRlY3RcbiIpOworCXByaW50ayhLRVJOX0lORk8gIm1kOiBJZiB5b3UgZG9uJ3QgdXNlIHJhaWQsIHVzZSByYWlkPW5vYXV0b2RldGVjdFxuIik7CisJd2hpbGUgKGRyaXZlcl9wcm9iZV9kb25lKCkgPCAwKQorCQltc2xlZXAoMTAwKTsKKwlmZCA9IHN5c19vcGVuKCIvZGV2L21kMCIsIDAsIDApOworCWlmIChmZCA+PSAwKSB7CisJCXN5c19pb2N0bChmZCwgUkFJRF9BVVRPUlVOLCByYWlkX2F1dG9wYXJ0KTsKKwkJc3lzX2Nsb3NlKGZkKTsKKwl9Cit9CisKIHZvaWQgX19pbml0IG1kX3J1bl9zZXR1cCh2b2lkKQogewogCWNyZWF0ZV9kZXYoIi9kZXYvbWQwIiwgTUtERVYoTURfTUFKT1IsIDApKTsKKwogCWlmIChyYWlkX25vYXV0b2RldGVjdCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IFNraXBwaW5nIGF1dG9kZXRlY3Rpb24gb2YgUkFJRCBhcnJheXMuIChyYWlkPW5vYXV0b2RldGVjdClcbiIpOwotCWVsc2UgewotCQlpbnQgZmQgPSBzeXNfb3BlbigiL2Rldi9tZDAiLCAwLCAwKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCXN5c19pb2N0bChmZCwgUkFJRF9BVVRPUlVOLCByYWlkX2F1dG9wYXJ0KTsKLQkJCXN5c19jbG9zZShmZCk7Ci0JCX0KLQl9CisJCXByaW50ayhLRVJOX0lORk8gIm1kOiBTa2lwcGluZyBhdXRvZGV0ZWN0aW9uIG9mIFJBSUQgYXJyYXlzLiAocmFpZD1hdXRvZGV0ZWN0IHdpbGwgZm9yY2UpXG4iKTsKKwllbHNlCisJCWF1dG9kZXRlY3RfcmFpZCgpOwogCW1kX3NldHVwX2RyaXZlKCk7CiB9CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IDM4MjAzMjMuLjI3ZjZiZjYgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC03MDgsNyArNzA4LDcgQEAKIAlpbnQgcmVzdWx0OwogCiAJaWYgKGluaXRjYWxsX2RlYnVnKSB7Ci0JCXByaW50aygiY2FsbGluZyAgJXBGXG4iLCBmbik7CisJCXByaW50aygiY2FsbGluZyAgJXBGIEAgJWlcbiIsIGZuLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CiAJCXQwID0ga3RpbWVfZ2V0KCk7CiAJfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggYTQzMGZkMC4uYWVlODkxYSAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtNTc3LDkgKzU3Nyw2IEBACiAgKiBAZm10OiBmb3JtYXQgc3RyaW5nCiAgKgogICogVGhpcyBpcyBwcmludGsoKS4gIEl0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4gIFdlIHdhbnQgaXQgdG8gd29yay4KLSAqIEJlIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgaWYgb29wc19pbl9wcm9ncmVzcyBpcyBub3Qgc2V0LCB3ZSBtaWdodCB0cnkgdG8KLSAqIHdha2Uga2xvZ2QgdXAgd2hpY2ggY291bGQgZGVhZGxvY2sgb24gcnVucXVldWUgbG9jayBpZiBwcmludGsoKSBpcyBjYWxsZWQKLSAqIGZyb20gc2NoZWR1bGVyIGNvZGUuCiAgKgogICogV2UgdHJ5IHRvIGdyYWIgdGhlIGNvbnNvbGVfc2VtLiAgSWYgd2Ugc3VjY2VlZCwgaXQncyBlYXN5IC0gd2UgbG9nIHRoZSBvdXRwdXQgYW5kCiAgKiBjYWxsIHRoZSBjb25zb2xlIGRyaXZlcnMuICBJZiB3ZSBmYWlsIHRvIGdldCB0aGUgc2VtYXBob3JlIHdlIHBsYWNlIHRoZSBvdXRwdXQKQEAgLTk4MiwxMCArOTc5LDI1IEBACiAJcmV0dXJuIGNvbnNvbGVfbG9ja2VkOwogfQogCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcmludGtfcGVuZGluZyk7CisKK3ZvaWQgcHJpbnRrX3RpY2sodm9pZCkKK3sKKwlpZiAoX19nZXRfY3B1X3ZhcihwcmludGtfcGVuZGluZykpIHsKKwkJX19nZXRfY3B1X3ZhcihwcmludGtfcGVuZGluZykgPSAwOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvZ193YWl0KTsKKwl9Cit9CisKK2ludCBwcmludGtfbmVlZHNfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIHBlcl9jcHUocHJpbnRrX3BlbmRpbmcsIGNwdSk7Cit9CisKIHZvaWQgd2FrZV91cF9rbG9nZCh2b2lkKQogewotCWlmICghb29wc19pbl9wcm9ncmVzcyAmJiB3YWl0cXVldWVfYWN0aXZlKCZsb2dfd2FpdCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9nX3dhaXQpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZsb2dfd2FpdCkpCisJCV9fcmF3X2dldF9jcHVfdmFyKHByaW50a19wZW5kaW5nKSA9IDE7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCA0MTRkNmZjLi43Nzk3ZGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMzgsMTAgKzM4LDYgQEAKIAogc3RhdGljIERFRklORV9SV0xPQ0socmVzb3VyY2VfbG9jayk7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCi1lbnVtIHsgTUFYX0lPUkVTX0xFVkVMID0gNSB9OwotCiBzdGF0aWMgdm9pZCAqcl9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IHJlc291cmNlICpwID0gdjsKQEAgLTUzLDYgKzQ5LDEwIEBACiAJcmV0dXJuIHAtPnNpYmxpbmc7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitlbnVtIHsgTUFYX0lPUkVTX0xFVkVMID0gNSB9OworCiBzdGF0aWMgdm9pZCAqcl9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogCV9fYWNxdWlyZXMocmVzb3VyY2VfbG9jaykKIHsKQEAgLTU0OSwxMyArNTQ5LDkgQEAKIAl9CiAKIAlpZiAoIXJlcykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiICAgIF9fcmVzZXJ2ZV9yZWdpb25fd2l0aF9zcGxpdDogKCVzKSBbJWxseCwgJWxseF0sIHJlczogKCVzKSBbJWxseCwgJWxseF1cbiIsCi0JCQkgY29uZmxpY3QtPm5hbWUsIGNvbmZsaWN0LT5zdGFydCwgY29uZmxpY3QtPmVuZCwKLQkJCSBuYW1lLCBzdGFydCwgZW5kKTsKLQogCQkvKiBmYWlsZWQsIHNwbGl0IGFuZCB0cnkgYWdhaW4gKi8KIAotCQkvKiBjb25mbGljdCBjb3ZlcnJlZCB3aG9sZSBhcmVhICovCisJCS8qIGNvbmZsaWN0IGNvdmVyZWQgd2hvbGUgYXJlYSAqLwogCQlpZiAoY29uZmxpY3QtPnN0YXJ0IDw9IHN0YXJ0ICYmIGNvbmZsaWN0LT5lbmQgPj0gZW5kKQogCQkJcmV0dXJuOwogCkBAIC04MzEsMyArODI3LDQwIEBACiB9CiAKIF9fc2V0dXAoInJlc2VydmU9IiwgcmVzZXJ2ZV9zZXR1cCk7CisKKy8qCisgKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIGFkZHIgYW5kIHNpemUgc3BhbnMgbW9yZSB0aGFuIGFueSBzbG90IGluIHRoZQorICogaW9tZW0gcmVzb3VyY2UgdHJlZS4KKyAqLworaW50IGlvbWVtX21hcF9zYW5pdHlfY2hlY2socmVzb3VyY2Vfc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnAgPSAmaW9tZW1fcmVzb3VyY2U7CisJaW50IGVyciA9IDA7CisJbG9mZl90IGw7CisKKwlyZWFkX2xvY2soJnJlc291cmNlX2xvY2spOworCWZvciAocCA9IHAtPmNoaWxkOyBwIDsgcCA9IHJfbmV4dChOVUxMLCBwLCAmbCkpIHsKKwkJLyoKKwkJICogV2UgY2FuIHByb2JhYmx5IHNraXAgdGhlIHJlc291cmNlcyB3aXRob3V0CisJCSAqIElPUkVTT1VSQ0VfSU8gYXR0cmlidXRlPworCQkgKi8KKwkJaWYgKHAtPnN0YXJ0ID49IGFkZHIgKyBzaXplKQorCQkJY29udGludWU7CisJCWlmIChwLT5lbmQgPCBhZGRyKQorCQkJY29udGludWU7CisJCWlmIChwLT5zdGFydCA8PSBhZGRyICYmIChwLT5lbmQgPj0gYWRkciArIHNpemUgLSAxKSkKKwkJCWNvbnRpbnVlOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZXNvdXJjZSBtYXAgc2FuaXR5IGNoZWNrIGNvbmZsaWN0OiAiCisJCSAgICAgICAiMHglbGx4IDB4JWxseCAweCVsbHggMHglbGx4ICVzXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoYWRkciArIHNpemUgLSAxKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcC0+c3RhcnQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXAtPmVuZCwKKwkJICAgICAgIHAtPm5hbWUpOworCQllcnIgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCBjNTA2ZjI2Li5iZTdhODI5IDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIEVYUE9SVF9TWU1CT0woaXJxX3N0YXQpOwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gc29mdGlycV92ZWNbMzJdIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworc3RhdGljIHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiBzb2Z0aXJxX3ZlY1tOUl9TT0ZUSVJRU10gX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwga3NvZnRpcnFkKTsKIApAQCAtMjA1LDcgKzIwNSwxOCBAQAogCiAJZG8gewogCQlpZiAocGVuZGluZyAmIDEpIHsKKwkJCWludCBwcmV2X2NvdW50ID0gcHJlZW1wdF9jb3VudCgpOworCiAJCQloLT5hY3Rpb24oaCk7CisKKwkJCWlmICh1bmxpa2VseShwcmV2X2NvdW50ICE9IHByZWVtcHRfY291bnQoKSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImh1aCwgZW50ZXJlZCBzb2Z0aXJxICVkICVwIgorCQkJCSAgICAgICAid2l0aCBwcmVlbXB0X2NvdW50ICUwOHgsIgorCQkJCSAgICAgICAiIGV4aXRlZCB3aXRoICUwOHg/XG4iLCBoIC0gc29mdGlycV92ZWMsCisJCQkJICAgICAgIGgtPmFjdGlvbiwgcHJldl9jb3VudCwgcHJlZW1wdF9jb3VudCgpKTsKKwkJCQlwcmVlbXB0X2NvdW50KCkgPSBwcmV2X2NvdW50OworCQkJfQorCiAJCQlyY3VfYmhfcXNjdHJfaW5jKGNwdSk7CiAJCX0KIAkJaCsrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c19uaS5jIGIva2VybmVsL3N5c19uaS5jCmluZGV4IDA4ZDZlMWIuLjUwM2Q4ZDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNfbmkuYworKysgYi9rZXJuZWwvc3lzX25pLmMKQEAgLTEyNSw2ICsxMjUsNyBAQAogY29uZF9zeXNjYWxsKHN5c192bTg2KTsKIGNvbmRfc3lzY2FsbChjb21wYXRfc3lzX2lwYyk7CiBjb25kX3N5c2NhbGwoY29tcGF0X3N5c19zeXNjdGwpOworY29uZF9zeXNjYWxsKHN5c19mbG9jayk7CiAKIC8qIGFyY2gtc3BlY2lmaWMgd2VhayBzeXNjYWxsIGVudHJpZXMgKi8KIGNvbmRfc3lzY2FsbChzeXNfcGNpY29uZmlnX3JlYWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGM0NjhjM2MuLmNmYzUyOTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTk2LDcgKzk2LDcgQEAKIHN0YXRpYyBpbnQgbmVnX29uZSA9IC0xOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTU1VCisjaWYgZGVmaW5lZChDT05GSUdfTU1VKSAmJiBkZWZpbmVkKENPTkZJR19GSUxFX0xPQ0tJTkcpCiBzdGF0aWMgaW50IHR3byA9IDI7CiAjZW5kaWYKIApAQCAtMTI0OCw2ICsxMjQ4LDcgQEAKIAkJLmV4dHJhMQkJPSAmbWlub2xkdWlkLAogCQkuZXh0cmEyCQk9ICZtYXhvbGR1aWQsCiAJfSwKKyNpZmRlZiBDT05GSUdfRklMRV9MT0NLSU5HCiAJewogCQkuY3RsX25hbWUJPSBGU19MRUFTRVMsCiAJCS5wcm9jbmFtZQk9ICJsZWFzZXMtZW5hYmxlIiwKQEAgLTEyNTYsNiArMTI1Nyw3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ROT1RJRlkKIAl7CiAJCS5jdGxfbmFtZQk9IEZTX0RJUl9OT1RJRlksCkBAIC0xMjY3LDYgKzEyNjksNyBAQAogCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTU1VCisjaWZkZWYgQ09ORklHX0ZJTEVfTE9DS0lORwogCXsKIAkJLmN0bF9uYW1lCT0gRlNfTEVBU0VfVElNRSwKIAkJLnByb2NuYW1lCT0gImxlYXNlLWJyZWFrLXRpbWUiLApAQCAtMTI3OCw2ICsxMjgxLDcgQEAKIAkJLmV4dHJhMQkJPSAmemVybywKIAkJLmV4dHJhMgkJPSAmdHdvLAogCX0sCisjZW5kaWYKIAl7CiAJCS5wcm9jbmFtZQk9ICJhaW8tbnIiLAogCQkuZGF0YQkJPSAmYWlvX25yLApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCmluZGV4IGE0ZDIxOTMuLmI3MTFmZmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCW5leHRfamlmZmllcyA9IGdldF9uZXh0X3RpbWVyX2ludGVycnVwdChsYXN0X2ppZmZpZXMpOwogCWRlbHRhX2ppZmZpZXMgPSBuZXh0X2ppZmZpZXMgLSBsYXN0X2ppZmZpZXM7CiAKLQlpZiAocmN1X25lZWRzX2NwdShjcHUpKQorCWlmIChyY3VfbmVlZHNfY3B1KGNwdSkgfHwgcHJpbnRrX25lZWRzX2NwdShjcHUpKQogCQlkZWx0YV9qaWZmaWVzID0gMTsKIAkvKgogCSAqIERvIG5vdCBzdG9wIHRoZSB0aWNrLCBpZiB3ZSBhcmUgb25seSBvbmUgb2ZmCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IDAzYmM3ZjEuLjUxMGZlNjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC05NzgsNiArOTc4LDcgQEAKIAlydW5fbG9jYWxfdGltZXJzKCk7CiAJaWYgKHJjdV9wZW5kaW5nKGNwdSkpCiAJCXJjdV9jaGVja19jYWxsYmFja3MoY3B1LCB1c2VyX3RpY2spOworCXByaW50a190aWNrKCk7CiAJc2NoZWR1bGVyX3RpY2soKTsKIAlydW5fcG9zaXhfY3B1X3RpbWVycyhwKTsKIH0KZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDBiZDljMmQuLjkxZWUzOTIgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMTg3LDYgKzE4Nyw5IEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWxsb3dzIG1lbW9yeSBhbmQgSU8gcmVzb3VyY2VzIHRvIGJlIDY0IGJpdC4KIAorY29uZmlnIFBIWVNfQUREUl9UXzY0QklUCisJZGVmX2Jvb2wgNjRCSVQgfHwgQVJDSF9QSFlTX0FERFJfVF82NEJJVAorCiBjb25maWcgWk9ORV9ETUFfRkxBRwogCWludAogCWRlZmF1bHQgIjAiIGlmICFaT05FX0RNQQpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9wc25hcC5jIGIvbmV0LzgwMi9wc25hcC5jCmluZGV4IGIzY2ZlNWEuLjcwOTgwYmEgMTAwNjQ0Ci0tLSBhL25ldC84MDIvcHNuYXAuYworKysgYi9uZXQvODAyL3BzbmFwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICoJU05BUCBkYXRhIGxpbmsgbGF5ZXIuIERlcml2ZWQgZnJvbSA4MDIuMgogICoKLSAqCQlBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPiwKKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKICAqCQlmcm9tIHRoZSA4MDIuMiBsYXllciBieSBHcmVnIFBhZ2UuCiAgKgkJTWVyZ2VkIGluIGFkZGl0aW9ucyBmcm9tIEdyZWcgUGFnZSdzIHBzbmFwLmMuCiAgKgpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggMGM4NTA0Mi4uZDMxMzRlNyAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC0yLDcgKzIsNyBAQAogICoJRERQOglBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBwbGVUYWxrIEREUCBwcm90b2NvbCBmb3IKICAqCQlFdGhlcm5ldCAnRUxBUCcuCiAgKgotICoJCUFsYW4gQ294ICA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUFsYW4gQ294ICA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqCQlXaXRoIG1vcmUgdGhhbiBhIGxpdHRsZSBhc3Npc3RhbmNlIGZyb20KICAqCkBAIC0xOTM0LDYgKzE5MzQsNiBAQAogbW9kdWxlX2V4aXQoYXRhbGtfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHBsZVRhbGsgMC4yMFxuIik7CiBNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfQVBQTEVUQUxLKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IDk2NDM0ZDcuLmFjZGVhYjMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtNTc4LDcgKzU3OCw3IEBACiAJaWYgKHNlc3Npb24tPmhpZCkgewogCQlpZiAoc2Vzc2lvbi0+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+aW5wdXQpOwogCWtmcmVlKHNlc3Npb24pOwogCXJldHVybiBlcnI7CkBAIC05NTAsMTggKzk3Myw0MyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBoaWRwX3RhYmxlW10gPSB7CisJeyBISURfQkxVRVRPT1RIX0RFVklDRShISURfQU5ZX0lELCBISURfQU5ZX0lEKSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGhpZHBfZHJpdmVyID0geworCS5uYW1lID0gImdlbmVyaWMtYmx1ZXRvb3RoIiwKKwkuaWRfdGFibGUgPSBoaWRwX3RhYmxlLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgaGlkcF9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCWwyY2FwX2xvYWQoKTsKIAogCUJUX0lORk8oIkhJRFAgKEh1bWFuIEludGVyZmFjZSBFbXVsYXRpb24pIHZlciAlcyIsIFZFUlNJT04pOwogCi0JcmV0dXJuIGhpZHBfaW5pdF9zb2NrZXRzKCk7CisJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmaGlkcF9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gaGlkcF9pbml0X3NvY2tldHMoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kcnY7CisKKwlyZXR1cm4gMDsKK2Vycl9kcnY6CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRwX2RyaXZlcik7CitlcnI6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGhpZHBfZXhpdCh2b2lkKQogewogCWhpZHBfY2xlYW51cF9zb2NrZXRzKCk7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRwX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGhpZHBfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oIGIvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaAppbmRleCAzNDNmYjA1Li5lNTAzYzg5IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmgKQEAgLTE1MSw2ICsxNTEsOCBAQAogCiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBjdHJsX3RyYW5zbWl0OwogCXN0cnVjdCBza19idWZmX2hlYWQgaW50cl90cmFuc21pdDsKKworCXN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9zY2hlZHVsZShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGF0YWdyYW0uYyBiL25ldC9jb3JlL2RhdGFncmFtLmMKaW5kZXggNTJmNTc3YS4uZWU2MzE4NCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGF0YWdyYW0uYworKysgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCkBAIC05LDcgKzksNyBAQAogICoJaWRlbnRpY2FsIHJlY3Ztc2coKSBjb2RlLiBTbyB3ZSBzaGFyZSBpdCBoZXJlLiBUaGUgcG9sbCB3YXMKICAqCXNoYXJlZCBiZWZvcmUgYnV0IGJ1cmllZCBpbiB1ZHAuYyBzbyBJIG1vdmVkIGl0LgogICoKLSAqCUF1dGhvcnM6CUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LiAoZGF0YWdyYW1fcG9sbCgpIGZyb20gb2xkCisgKglBdXRob3JzOglBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPi4gKGRhdGFncmFtX3BvbGwoKSBmcm9tIG9sZAogICoJCQkJCQkgICAgIHVkcC5jIGNvZGUpCiAgKgogICoJRml4ZXM6CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXZfbWNhc3QuYyBiL25ldC9jb3JlL2Rldl9tY2FzdC5jCmluZGV4IDU0MDJiM2IuLjllMmZhMzkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldl9tY2FzdC5jCisrKyBiL25ldC9jb3JlL2Rldl9tY2FzdC5jCkBAIC02LDcgKzYsNyBAQAogICoJCVJpY2hhcmQgVW5kZXJ3b29kIDxyaWNoYXJkQHd1enouZGVtb24uY28udWs+CiAgKgogICoJU3RpciBmcmllZCB0b2dldGhlciBmcm9tIHRoZSBJUCBtdWx0aWNhc3QgYW5kIENBUCBwYXRjaGVzIGFib3ZlCi0gKgkJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqCUZpeGVzOgogICoJCUFsYW4gQ294CToJVXBkYXRlIHRoZSBkZXZpY2Ugb24gYSByZWFsIGRlbGV0ZQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcGt0Z2VuLmMgYi9uZXQvY29yZS9wa3RnZW4uYwppbmRleCBhNzU2ODQ3Li45OWY2NTZkIDEwMDY0NAotLS0gYS9uZXQvY29yZS9wa3RnZW4uYworKysgYi9uZXQvY29yZS9wa3RnZW4uYwpAQCAtMjQ3NCw3ICsyNDc0LDcgQEAKIAkJCQlpZiAocmV0IDwgMCkgewogCQkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGV4cGFuZGluZyAiCiAJCQkJCSAgICAgICAiaXBzZWMgcGFja2V0ICVkXG4iLHJldCk7Ci0JCQkJCXJldHVybiAwOworCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl9CiAKQEAgLTI0ODQsOCArMjQ4NCw3IEBACiAJCQlpZiAocmV0KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjcmVhdGluZyBpcHNlYyAiCiAJCQkJICAgICAgICJwYWNrZXQgJWRcbiIscmV0KTsKLQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCQlyZXR1cm4gMDsKKwkJCQlnb3RvIGVycjsKIAkJCX0KIAkJCS8qIHJlc3RvcmUgbGwgKi8KIAkJCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwpAQCAtMjQ5NCw2ICsyNDkzLDkgQEAKIAkJfQogCX0KIAlyZXR1cm4gMTsKK2VycjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDdmN2JiMWEuLjRlMjJlM2EgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqCVJvdXRpbmVzIGhhdmluZyB0byBkbyB3aXRoIHRoZSAnc3RydWN0IHNrX2J1ZmYnIG1lbW9yeSBoYW5kbGVycy4KICAqCi0gKglBdXRob3JzOglBbGFuIENveCA8aWlpdGFjQHB5ci5zd2FuLmFjLnVrPgorICoJQXV0aG9yczoJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCQkJRmxvcmlhbiBMYSBSb2NoZSA8cnpzZmxAcnoudW5pLXNiLmRlPgogICoKICAqCUZpeGVzOgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3RyZWFtLmMgYi9uZXQvY29yZS9zdHJlYW0uYwppbmRleCBhNmIzNDM3Li44NzI3Y2VhIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zdHJlYW0uYworKysgYi9uZXQvY29yZS9zdHJlYW0uYwpAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiAgICAgQXV0aG9yczogICAgICAgIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgogICogICAgICAgICAgICAgICAgICAgICAoZnJvbSBvbGQgdGNwLmMgY29kZSkKLSAqICAgICAgICAgICAgICAgICAgICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gKEJvcnJvd2VkIGNvbW1lbnRzIDgtKSkKKyAqICAgICAgICAgICAgICAgICAgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4gKEJvcnJvd2VkIGNvbW1lbnRzIDgtKSkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9uZXQvZHNhL0tjb25maWcgYi9uZXQvZHNhL0tjb25maWcKaW5kZXggY2RjZTRjNi4uNDkyMTFiMyAxMDA2NDQKLS0tIGEvbmV0L2RzYS9LY29uZmlnCisrKyBiL25ldC9kc2EvS2NvbmZpZwpAQCAtMSw3ICsxLDcgQEAKIG1lbnVjb25maWcgTkVUX0RTQQogCWJvb2wgIkRpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUgc3VwcG9ydCIKIAlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmICFTMzkwCiAJc2VsZWN0IFBIWUxJQgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgaGFyZHdhcmUgc3dpdGNoIGNoaXBzIHRoYXQgdXNlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pY21wLmMgYi9uZXQvaXB2NC9pY21wLmMKaW5kZXggNTVjMzU1ZS4uNzJiMmRlNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWNtcC5jCisrKyBiL25ldC9pcHY0L2ljbXAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKglORVQzOglJbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUNNUCBwcm90b2NvbCBsYXllci4KICAqCi0gKgkJQWxhbiBDb3gsIDxhbGFuQHJlZGhhdC5jb20+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCA3ZjllMzM3Li5hMGQ4NjQ1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC05LDcgKzksNyBAQAogICoJc2VlbXMgdG8gZmFsbCBvdXQgd2l0aCBnY2MgMi42LjIuCiAgKgogICoJQXV0aG9yczoKLSAqCQlBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCmluZGV4IDIxNTJkMjIuLmU0ZjgxZjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKKysrIGIvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYwpAQCAtNiw3ICs2LDcgQEAKICAqCQlUaGUgSVAgZnJhZ21lbnRhdGlvbiBmdW5jdGlvbmFsaXR5LgogICoKICAqIEF1dGhvcnM6CUZyZWQgTi4gdmFuIEtlbXBlbiA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+Ci0gKgkJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqIEZpeGVzOgogICoJCUFsYW4gQ294CToJU3BsaXQgZnJvbSBpcC5jICwgc2VlIGlwX2lucHV0LmMgZm9yIGhpc3RvcnkuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9pbnB1dC5jIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwppbmRleCBlMGJlZDU2Li44NjE5NzhhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L2lwX2lucHV0LmMKQEAgLTgsNyArOCw3IEBACiAgKiBBdXRob3JzOglSb3NzIEJpcm8KICAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KICAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KLSAqCQlBbGFuIENveCwgPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCQlBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCQlSaWNoYXJkIFVuZGVyd29vZAogICoJCVN0ZWZhbiBCZWNrZXIsIDxzdGVmYW5iQHllbGxvLnBpbmcuZGU+CiAgKgkJSm9yZ2UgQ3dpaywgPGpvcmdlQGxhc2VyLnNhdGxpbmsubmV0PgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBpcC5jIGIvbmV0L2lwdjQvaXBpcC5jCmluZGV4IDRjNmQyY2EuLjI5NjA5ZDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwaXAuYworKysgYi9uZXQvaXB2NC9pcGlwLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAkJTWFkZSB0aGUgdHVubmVscyB1c2UgZGV2LT5uYW1lIG5vdCB0dW5uZWw6IHdoZW4gZXJyb3IgcmVwb3J0aW5nLgogCQlBZGRlZCB0eF9kcm9wcGVkIHN0YXQKIAotCQktQWxhbiBDb3gJKEFsYW4uQ294QGxpbnV4Lm9yZykgMjEgTWFyY2ggOTUKKwkJLUFsYW4gQ294CShhbGFuQGx4b3JndWsudWt1dS5vcmcudWspIDIxIE1hcmNoIDk1CiAKIAlSZXdvcmtlZDoKIAkJQ2hhbmdlZCB0byB0dW5uZWwgdG8gZGVzdGluYXRpb24gZ2F0ZXdheSBpbiBhZGRpdGlvbiB0byB0aGUKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwbXIuYyBiL25ldC9pcHY0L2lwbXIuYwppbmRleCBjNTE5YjhkLi5iNDJlMDgyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqCUlQIG11bHRpY2FzdCByb3V0aW5nIHN1cHBvcnQgZm9yIG1yb3V0ZWQgMy42LzMuOAogICoKLSAqCQkoYykgMTk5NSBBbGFuIENveCwgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCQkoYykgMTk5NSBBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCSAgTGludXggQ29uc3VsdGFuY3kgYW5kIEN1c3RvbSBEcml2ZXIgRGV2ZWxvcG1lbnQKICAqCiAgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IGVhY2Y0Y2YuLjIwOTVhYmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC04LDcgKzgsNyBAQAogICogQXV0aG9yczoJUm9zcyBCaXJvCiAgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CiAgKgkJQXJudCBHdWxicmFuZHNlbiwgPGFndWxicmFAbnZnLnVuaXQubm8+Ci0gKgkJQWxhbiBDb3gsIDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkJSGlyb2thenUgVGFrYWhhc2hpLCA8dGFrYUB2YWxpbnV4LmNvLmpwPgogICoKICAqIEZpeGVzOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggMDUwZTE0Yi4uMDFlZGFjOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC04MzQsNyArODM0LDcgQEAKIAlzbm1wX21pYl9mcmVlKCh2b2lkICoqKW5ldC0+bWliLmljbXB2Nm1zZ19zdGF0aXN0aWNzKTsKIH0KIAotc3RhdGljIGludCBpbmV0Nl9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCitzdGF0aWMgaW50IF9fbmV0X2luaXQgaW5ldDZfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCWludCBlcnIgPSAwOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggYjBlYWNjMC4uMmZkOGFmYSAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBORVRMSU5LICAgICAgS2VybmVsLXVzZXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbC4KICAqCi0gKiAJCUF1dGhvcnM6CUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiAJCUF1dGhvcnM6CUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiAJCQkJQWxleGV5IEt1em5ldHNvdiA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CiAgKgogICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKZGlmZiAtLWdpdCBhL25ldC9yZmtpbGwvcmZraWxsLWlucHV0LmMgYi9uZXQvcmZraWxsL3Jma2lsbC1pbnB1dC5jCmluZGV4IGU1YjY5NTUuLjIxMTI0ZWMgMTAwNjQ0Ci0tLSBhL25ldC9yZmtpbGwvcmZraWxsLWlucHV0LmMKKysrIGIvbmV0L3Jma2lsbC9yZmtpbGwtaW5wdXQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAicmZraWxsLWlucHV0LmgiCiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2xudC5jIGIvbmV0L3N1bnJwYy9jbG50LmMKaW5kZXggNzY3MzllOS4uZGEwNzg5ZiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jbG50LmMKKysrIGIvbmV0L3N1bnJwYy9jbG50LmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWNsbnQtPmNsX3Byb2NpbmZvID0gdmVyc2lvbi0+cHJvY3M7CiAJY2xudC0+Y2xfbWF4cHJvYyAgPSB2ZXJzaW9uLT5ucnByb2NzOwogCWNsbnQtPmNsX3Byb3RuYW1lID0gcHJvZ3JhbS0+bmFtZTsKLQljbG50LT5jbF9wcm9nICAgICA9IHByb2dyYW0tPm51bWJlcjsKKwljbG50LT5jbF9wcm9nICAgICA9IGFyZ3MtPnByb2dudW1iZXIgPyA6IHByb2dyYW0tPm51bWJlcjsKIAljbG50LT5jbF92ZXJzICAgICA9IHZlcnNpb24tPm51bWJlcjsKIAljbG50LT5jbF9zdGF0cyAgICA9IHByb2dyYW0tPnN0YXRzOwogCWNsbnQtPmNsX21ldHJpY3MgID0gcnBjX2FsbG9jX2lvc3RhdHMoY2xudCk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCAyNGRiMmI0Li4zNGFiYzkxIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgpAQCAtMTc2LDEzICsxNzcsMTIgQEAKIH0KIAogc3RhdGljIGludCBycGNiX3JlZ2lzdGVyX2NhbGwoc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcmxlbiwKLQkJCSAgICAgIHUzMiB2ZXJzaW9uLCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZywKLQkJCSAgICAgIGludCAqcmVzdWx0KQorCQkJICAgICAgdTMyIHZlcnNpb24sIHN0cnVjdCBycGNfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBycGNfY2xudCAqcnBjYl9jbG50OwotCWludCBlcnJvciA9IDA7CisJaW50IHJlc3VsdCwgZXJyb3IgPSAwOwogCi0JKnJlc3VsdCA9IDA7CisJbXNnLT5ycGNfcmVzcCA9ICZyZXN1bHQ7CiAKIAlycGNiX2NsbnQgPSBycGNiX2NyZWF0ZV9sb2NhbChhZGRyLCBhZGRybGVuLCB2ZXJzaW9uKTsKIAlpZiAoIUlTX0VSUihycGNiX2NsbnQpKSB7CkBAIC0xOTEsMTIgKzE5MSwxNSBAQAogCX0gZWxzZQogCQllcnJvciA9IFBUUl9FUlIocnBjYl9jbG50KTsKIAotCWlmIChlcnJvciA8IDApCisJaWYgKGVycm9yIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJSUEM6IGZhaWxlZCB0byBjb250YWN0IGxvY2FsIHJwY2JpbmQgIgogCQkJCSJzZXJ2ZXIgKGVycm5vICVkKS5cbiIsIC1lcnJvcik7Ci0JZHByaW50aygiUlBDOiAgICAgICByZWdpc3RyYXRpb24gc3RhdHVzICVkLyVkXG4iLCBlcnJvciwgKnJlc3VsdCk7CisJCXJldHVybiBlcnJvcjsKKwl9CiAKLQlyZXR1cm4gZXJyb3I7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUFDQ0VTOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTIwNSw3ICsyMDgsMTEgQEAKICAqIEB2ZXJzOiBSUEMgdmVyc2lvbiBudW1iZXIgdG8gYmluZAogICogQHByb3Q6IHRyYW5zcG9ydCBwcm90b2NvbCB0byByZWdpc3RlcgogICogQHBvcnQ6IHBvcnQgdmFsdWUgdG8gcmVnaXN0ZXIKLSAqIEBva2F5OiBPVVQ6IHJlc3VsdCBjb2RlCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHRoZSByZWdpc3RyYXRpb24gcmVxdWVzdCB3YXMgZGlzcGF0Y2hlZCBzdWNjZXNzZnVsbHkKKyAqIGFuZCB0aGUgcnBjYmluZCBkYWVtb24gcmV0dXJuZWQgc3VjY2Vzcy4gIE90aGVyd2lzZSwgcmV0dXJucyBhbiBlcnJubworICogdmFsdWUgdGhhdCByZWZsZWN0cyB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvciAocmVxdWVzdCBjb3VsZCBub3QgYmUKKyAqIGRpc3BhdGNoZWQsIHRpbWVkIG91dCwgb3IgcnBjYmluZCByZXR1cm5lZCBhbiBlcnJvcikuCiAgKgogICogUlBDIHNlcnZpY2VzIGludm9rZSB0aGlzIGZ1bmN0aW9uIHRvIGFkdmVydGlzZSB0aGVpciBjb250YWN0CiAgKiBpbmZvcm1hdGlvbiB2aWEgdGhlIHN5c3RlbSdzIHJwY2JpbmQgZGFlbW9uLiAgUlBDIHNlcnZpY2VzCkBAIC0yMTcsMTUgKzIyNCw2IEBACiAgKiBhbGwgcmVnaXN0ZXJlZCB0cmFuc3BvcnRzIGZvciBbcHJvZ3JhbSwgdmVyc2lvbl0gZnJvbSB0aGUgbG9jYWwKICAqIHJwY2JpbmQgZGF0YWJhc2UuCiAgKgotICogUmV0dXJucyB6ZXJvIGlmIHRoZSByZWdpc3RyYXRpb24gcmVxdWVzdCB3YXMgZGlzcGF0Y2hlZAotICogc3VjY2Vzc2Z1bGx5IGFuZCBhIHJlcGx5IHdhcyByZWNlaXZlZC4gIFRoZSBycGNiaW5kIGRhZW1vbidzCi0gKiBib29sZWFuIHJlc3VsdCBjb2RlIGlzIHN0b3JlZCBpbiAqb2theS4KLSAqCi0gKiBSZXR1cm5zIGFuIGVycm5vIHZhbHVlIGFuZCBzZXRzICpyZXN1bHQgdG8gemVybyBpZiB0aGVyZSB3YXMKLSAqIHNvbWUgcHJvYmxlbSB0aGF0IHByZXZlbnRlZCB0aGUgcnBjYmluZCByZXF1ZXN0IGZyb20gYmVpbmcKLSAqIGRpc3BhdGNoZWQsIG9yIGlmIHRoZSBycGNiaW5kIGRhZW1vbiBkaWQgbm90IHJlc3BvbmQgd2l0aGluCi0gKiB0aGUgdGltZW91dC4KLSAqCiAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgcnBjYmluZCBwcm90b2NvbCB2ZXJzaW9uIDIgdG8gY29udGFjdCB0aGUKICAqIGxvY2FsIHJwY2JpbmQgZGFlbW9uLgogICoKQEAgLTIzNiw3ICsyMzQsNyBAQAogICogSU42QUREUl9BTlkgKGllIGF2YWlsYWJsZSBmb3IgYWxsIEFGX0lORVQgYW5kIEFGX0lORVQ2CiAgKiBhZGRyZXNzZXMpLgogICovCi1pbnQgcnBjYl9yZWdpc3Rlcih1MzIgcHJvZywgdTMyIHZlcnMsIGludCBwcm90LCB1bnNpZ25lZCBzaG9ydCBwb3J0LCBpbnQgKm9rYXkpCitpbnQgcnBjYl9yZWdpc3Rlcih1MzIgcHJvZywgdTMyIHZlcnMsIGludCBwcm90LCB1bnNpZ25lZCBzaG9ydCBwb3J0KQogewogCXN0cnVjdCBycGNiaW5kX2FyZ3MgbWFwID0gewogCQkucl9wcm9nCQk9IHByb2csCkBAIC0yNDYsNyArMjQ0LDYgQEAKIAl9OwogCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CiAJCS5ycGNfYXJncAk9ICZtYXAsCi0JCS5ycGNfcmVzcAk9IG9rYXksCiAJfTsKIAogCWRwcmludGsoIlJQQzogICAgICAgJXNyZWdpc3RlcmluZyAoJXUsICV1LCAlZCwgJXUpIHdpdGggbG9jYWwgIgpAQCAtMjU5LDcgKzI1Niw3IEBACiAKIAlyZXR1cm4gcnBjYl9yZWdpc3Rlcl9jYWxsKChzdHJ1Y3Qgc29ja2FkZHIgKikmcnBjYl9pbmFkZHJfbG9vcGJhY2ssCiAJCQkJCXNpemVvZihycGNiX2luYWRkcl9sb29wYmFjayksCi0JCQkJCVJQQ0JWRVJTXzIsICZtc2csIG9rYXkpOworCQkJCQlSUENCVkVSU18yLCAmbXNnKTsKIH0KIAogLyoKQEAgLTI5MCw3ICsyODcsNyBAQAogCiAJcmV0dXJuIHJwY2JfcmVnaXN0ZXJfY2FsbCgoc3RydWN0IHNvY2thZGRyICopJnJwY2JfaW5hZGRyX2xvb3BiYWNrLAogCQkJCQlzaXplb2YocnBjYl9pbmFkZHJfbG9vcGJhY2spLAotCQkJCQlSUENCVkVSU180LCBtc2csIG1zZy0+cnBjX3Jlc3ApOworCQkJCQlSUENCVkVSU180LCBtc2cpOwogfQogCiAvKgpAQCAtMzA0LDEwICszMDEsMTMgQEAKIAljaGFyIGJ1Zls2NF07CiAKIAkvKiBDb25zdHJ1Y3QgQUZfSU5FVDYgdW5pdmVyc2FsIGFkZHJlc3MgKi8KLQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJTklQNl9GTVQiLiV1LiV1IiwKLQkJCU5JUDYoYWRkcmVzc190b19yZWdpc3Rlci0+c2luNl9hZGRyKSwKLQkJCXBvcnQgPj4gOCwgcG9ydCAmIDB4ZmYpOworCWlmIChpcHY2X2FkZHJfYW55KCZhZGRyZXNzX3RvX3JlZ2lzdGVyLT5zaW42X2FkZHIpKQorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiOjouJXUuJXUiLAorCQkJCXBvcnQgPj4gOCwgcG9ydCAmIDB4ZmYpOworCWVsc2UKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgTklQNl9GTVQiLiV1LiV1IiwKKwkJCQlOSVA2KGFkZHJlc3NfdG9fcmVnaXN0ZXItPnNpbjZfYWRkciksCisJCQkJcG9ydCA+PiA4LCBwb3J0ICYgMHhmZik7CiAJbWFwLT5yX2FkZHIgPSBidWY7CiAKIAlkcHJpbnRrKCJSUEM6ICAgICAgICVzcmVnaXN0ZXJpbmcgWyV1LCAldSwgJXMsICclcyddIHdpdGggIgpAQCAtMzIxLDcgKzMyMSw3IEBACiAKIAlyZXR1cm4gcnBjYl9yZWdpc3Rlcl9jYWxsKChzdHJ1Y3Qgc29ja2FkZHIgKikmcnBjYl9pbjZhZGRyX2xvb3BiYWNrLAogCQkJCQlzaXplb2YocnBjYl9pbjZhZGRyX2xvb3BiYWNrKSwKLQkJCQkJUlBDQlZFUlNfNCwgbXNnLCBtc2ctPnJwY19yZXNwKTsKKwkJCQkJUlBDQlZFUlNfNCwgbXNnKTsKIH0KIAogLyoqCkBAIC0zMzAsNyArMzMwLDExIEBACiAgKiBAdmVyc2lvbjogUlBDIHZlcnNpb24gbnVtYmVyIG9mIHNlcnZpY2UgdG8gKHVuKXJlZ2lzdGVyCiAgKiBAYWRkcmVzczogYWRkcmVzcyBmYW1pbHksIElQIGFkZHJlc3MsIGFuZCBwb3J0IHRvICh1bilyZWdpc3RlcgogICogQG5ldGlkOiBuZXRpZCBvZiB0cmFuc3BvcnQgcHJvdG9jb2wgdG8gKHVuKXJlZ2lzdGVyCi0gKiBAcmVzdWx0OiByZXN1bHQgY29kZSBmcm9tIHJwY2JpbmQgUlBDIGNhbGwKKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgdGhlIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IHdhcyBkaXNwYXRjaGVkIHN1Y2Nlc3NmdWxseQorICogYW5kIHRoZSBycGNiaW5kIGRhZW1vbiByZXR1cm5lZCBzdWNjZXNzLiAgT3RoZXJ3aXNlLCByZXR1cm5zIGFuIGVycm5vCisgKiB2YWx1ZSB0aGF0IHJlZmxlY3RzIHRoZSBuYXR1cmUgb2YgdGhlIGVycm9yIChyZXF1ZXN0IGNvdWxkIG5vdCBiZQorICogZGlzcGF0Y2hlZCwgdGltZWQgb3V0LCBvciBycGNiaW5kIHJldHVybmVkIGFuIGVycm9yKS4KICAqCiAgKiBSUEMgc2VydmljZXMgaW52b2tlIHRoaXMgZnVuY3Rpb24gdG8gYWR2ZXJ0aXNlIHRoZWlyIGNvbnRhY3QKICAqIGluZm9ybWF0aW9uIHZpYSB0aGUgc3lzdGVtJ3MgcnBjYmluZCBkYWVtb24uICBSUEMgc2VydmljZXMKQEAgLTM0MiwxNSArMzQ2LDYgQEAKICAqIHRvIHplcm8uICBDYWxsZXJzIHBhc3MgYSBuZXRpZCBvZiAiIiB0byB1bnJlZ2lzdGVyIGFsbAogICogdHJhbnNwb3J0IG5ldGlkcyBhc3NvY2lhdGVkIHdpdGggW3Byb2dyYW0sIHZlcnNpb24sIGFkZHJlc3NdLgogICoKLSAqIFJldHVybnMgemVybyBpZiB0aGUgcmVnaXN0cmF0aW9uIHJlcXVlc3Qgd2FzIGRpc3BhdGNoZWQKLSAqIHN1Y2Nlc3NmdWxseSBhbmQgYSByZXBseSB3YXMgcmVjZWl2ZWQuICBUaGUgcnBjYmluZCBkYWVtb24ncwotICogcmVzdWx0IGNvZGUgaXMgc3RvcmVkIGluICpyZXN1bHQuCi0gKgotICogUmV0dXJucyBhbiBlcnJubyB2YWx1ZSBhbmQgc2V0cyAqcmVzdWx0IHRvIHplcm8gaWYgdGhlcmUgd2FzCi0gKiBzb21lIHByb2JsZW0gdGhhdCBwcmV2ZW50ZWQgdGhlIHJwY2JpbmQgcmVxdWVzdCBmcm9tIGJlaW5nCi0gKiBkaXNwYXRjaGVkLCBvciBpZiB0aGUgcnBjYmluZCBkYWVtb24gZGlkIG5vdCByZXNwb25kIHdpdGhpbgotICogdGhlIHRpbWVvdXQuCi0gKgogICogVGhpcyBmdW5jdGlvbiB1c2VzIHJwY2JpbmQgcHJvdG9jb2wgdmVyc2lvbiA0IHRvIGNvbnRhY3QgdGhlCiAgKiBsb2NhbCBycGNiaW5kIGRhZW1vbi4gIFRoZSBsb2NhbCBycGNiaW5kIGRhZW1vbiBtdXN0IHN1cHBvcnQKICAqIHZlcnNpb24gNCBvZiB0aGUgcnBjYmluZCBwcm90b2NvbCBpbiBvcmRlciBmb3IgdGhlc2UgZnVuY3Rpb25zCkBAIC0zNzIsOCArMzY3LDcgQEAKICAqIGFkdmVydGlzZXMgdGhlIHNlcnZpY2Ugb24gYWxsIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzLgogICovCiBpbnQgcnBjYl92NF9yZWdpc3Rlcihjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCi0JCSAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyZXNzLCBjb25zdCBjaGFyICpuZXRpZCwKLQkJICAgICBpbnQgKnJlc3VsdCkKKwkJICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKm5ldGlkKQogewogCXN0cnVjdCBycGNiaW5kX2FyZ3MgbWFwID0gewogCQkucl9wcm9nCQk9IHByb2dyYW0sCkBAIC0zODMsMTEgKzM3Nyw4IEBACiAJfTsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX2FyZ3AJPSAmbWFwLAotCQkucnBjX3Jlc3AJPSByZXN1bHQsCiAJfTsKIAotCSpyZXN1bHQgPSAwOwotCiAJc3dpdGNoIChhZGRyZXNzLT5zYV9mYW1pbHkpIHsKIAljYXNlIEFGX0lORVQ6CiAJCXJldHVybiBycGNiX3JlZ2lzdGVyX25ldGlkNCgoc3RydWN0IHNvY2thZGRyX2luICopYWRkcmVzcywKQEAgLTYzMyw3ICs2MjQsNyBAQAogc3RhdGljIGludCBycGNiX2VuY29kZV9tYXBwaW5nKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCiAJCQkgICAgICAgc3RydWN0IHJwY2JpbmRfYXJncyAqcnBjYikKIHsKLQlkcHJpbnRrKCJSUEM6ICAgICAgIHJwY2JfZW5jb2RlX21hcHBpbmcoJXUsICV1LCAlZCwgJXUpXG4iLAorCWRwcmludGsoIlJQQzogICAgICAgZW5jb2RpbmcgcnBjYiByZXF1ZXN0ICgldSwgJXUsICVkLCAldSlcbiIsCiAJCQlycGNiLT5yX3Byb2csIHJwY2ItPnJfdmVycywgcnBjYi0+cl9wcm90LCBycGNiLT5yX3BvcnQpOwogCSpwKysgPSBodG9ubChycGNiLT5yX3Byb2cpOwogCSpwKysgPSBodG9ubChycGNiLT5yX3ZlcnMpOwpAQCAtNjQ4LDcgKzYzOSw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgKnBvcnRwKQogewogCSpwb3J0cCA9ICh1bnNpZ25lZCBzaG9ydCkgbnRvaGwoKnArKyk7Ci0JZHByaW50aygiUlBDOiAgICAgICBycGNiX2RlY29kZV9nZXRwb3J0IHJlc3VsdCAldVxuIiwKKwlkcHJpbnRrKCJSUEM6ICAgICAgIHJwY2IgZ2V0cG9ydCByZXN1bHQ6ICV1XG4iLAogCQkJKnBvcnRwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY1Nyw3ICs2NDgsNyBAQAogCQkJICAgdW5zaWduZWQgaW50ICpib29scCkKIHsKIAkqYm9vbHAgPSAodW5zaWduZWQgaW50KSBudG9obCgqcCsrKTsKLQlkcHJpbnRrKCJSUEM6ICAgICAgIHJwY2JfZGVjb2RlX3NldDogY2FsbCAlc1xuIiwKKwlkcHJpbnRrKCJSUEM6ICAgICAgIHJwY2Igc2V0L3Vuc2V0IGNhbGwgJXNcbiIsCiAJCQkoKmJvb2xwID8gInN1Y2NlZWRlZCIgOiAiZmFpbGVkIikpOwogCXJldHVybiAwOwogfQpAQCAtNjY1LDcgKzY1Niw3IEBACiBzdGF0aWMgaW50IHJwY2JfZW5jb2RlX2dldGFkZHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKIAkJCSAgICAgICBzdHJ1Y3QgcnBjYmluZF9hcmdzICpycGNiKQogewotCWRwcmludGsoIlJQQzogICAgICAgcnBjYl9lbmNvZGVfZ2V0YWRkcigldSwgJXUsICVzKVxuIiwKKwlkcHJpbnRrKCJSUEM6ICAgICAgIGVuY29kaW5nIHJwY2IgcmVxdWVzdCAoJXUsICV1LCAlcylcbiIsCiAJCQlycGNiLT5yX3Byb2csIHJwY2ItPnJfdmVycywgcnBjYi0+cl9hZGRyKTsKIAkqcCsrID0gaHRvbmwocnBjYi0+cl9wcm9nKTsKIAkqcCsrID0gaHRvbmwocnBjYi0+cl92ZXJzKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjLmMgYi9uZXQvc3VucnBjL3N2Yy5jCmluZGV4IDVhMzJjYjcuLjU0Yzk4ZDggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjLmMKKysrIGIvbmV0L3N1bnJwYy9zdmMuYwpAQCAtMjgsNiArMjgsOCBAQAogCiAjZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfU1ZDRFNQCiAKK3N0YXRpYyB2b2lkIHN2Y191bnJlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2Vydik7CisKICNkZWZpbmUgc3ZjX3NlcnZfaXNfcG9vbGVkKHNlcnYpICAgICgoc2VydiktPnN2X2Z1bmN0aW9uKQogCiAvKgpAQCAtMzU3LDcgKzM1OSw3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3NlcnYgKgogX19zdmNfY3JlYXRlKHN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZywgdW5zaWduZWQgaW50IGJ1ZnNpemUsIGludCBucG9vbHMsCi0JICAgdm9pZCAoKnNodXRkb3duKShzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpKQorCSAgIHNhX2ZhbWlseV90IGZhbWlseSwgdm9pZCAoKnNodXRkb3duKShzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpKQogewogCXN0cnVjdCBzdmNfc2Vydgkqc2VydjsKIAl1bnNpZ25lZCBpbnQgdmVyczsKQEAgLTM2Niw2ICszNjgsNyBAQAogCiAJaWYgKCEoc2VydiA9IGt6YWxsb2Moc2l6ZW9mKCpzZXJ2KSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gTlVMTDsKKwlzZXJ2LT5zdl9mYW1pbHkgICAgPSBmYW1pbHk7CiAJc2Vydi0+c3ZfbmFtZSAgICAgID0gcHJvZy0+cGdfbmFtZTsKIAlzZXJ2LT5zdl9wcm9ncmFtICAgPSBwcm9nOwogCXNlcnYtPnN2X25ydGhyZWFkcyA9IDE7CkBAIC00MTYsMzAgKzQxOSwyOSBAQAogCQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+c3BfbG9jayk7CiAJfQogCi0KIAkvKiBSZW1vdmUgYW55IHN0YWxlIHBvcnRtYXAgcmVnaXN0cmF0aW9ucyAqLwotCXN2Y19yZWdpc3RlcihzZXJ2LCAwLCAwKTsKKwlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKIAogCXJldHVybiBzZXJ2OwogfQogCiBzdHJ1Y3Qgc3ZjX3NlcnYgKgogc3ZjX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2csIHVuc2lnbmVkIGludCBidWZzaXplLAotCQl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqc2VydikpCisJCXNhX2ZhbWlseV90IGZhbWlseSwgdm9pZCAoKnNodXRkb3duKShzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpKQogewotCXJldHVybiBfX3N2Y19jcmVhdGUocHJvZywgYnVmc2l6ZSwgLypucG9vbHMqLzEsIHNodXRkb3duKTsKKwlyZXR1cm4gX19zdmNfY3JlYXRlKHByb2csIGJ1ZnNpemUsIC8qbnBvb2xzKi8xLCBmYW1pbHksIHNodXRkb3duKTsKIH0KIEVYUE9SVF9TWU1CT0woc3ZjX2NyZWF0ZSk7CiAKIHN0cnVjdCBzdmNfc2VydiAqCiBzdmNfY3JlYXRlX3Bvb2xlZChzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2csIHVuc2lnbmVkIGludCBidWZzaXplLAotCQl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqc2VydiksCisJCSAgc2FfZmFtaWx5X3QgZmFtaWx5LCB2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqc2VydiksCiAJCSAgc3ZjX3RocmVhZF9mbiBmdW5jLCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJc3RydWN0IHN2Y19zZXJ2ICpzZXJ2OwogCXVuc2lnbmVkIGludCBucG9vbHMgPSBzdmNfcG9vbF9tYXBfZ2V0KCk7CiAKLQlzZXJ2ID0gX19zdmNfY3JlYXRlKHByb2csIGJ1ZnNpemUsIG5wb29scywgc2h1dGRvd24pOworCXNlcnYgPSBfX3N2Y19jcmVhdGUocHJvZywgYnVmc2l6ZSwgbnBvb2xzLCBmYW1pbHksIHNodXRkb3duKTsKIAogCWlmIChzZXJ2ICE9IE5VTEwpIHsKIAkJc2Vydi0+c3ZfZnVuY3Rpb24gPSBmdW5jOwpAQCAtNDg2LDggKzQ4OCw3IEBACiAJaWYgKHN2Y19zZXJ2X2lzX3Bvb2xlZChzZXJ2KSkKIAkJc3ZjX3Bvb2xfbWFwX3B1dCgpOwogCi0JLyogVW5yZWdpc3RlciBzZXJ2aWNlIHdpdGggdGhlIHBvcnRtYXBwZXIgKi8KLQlzdmNfcmVnaXN0ZXIoc2VydiwgMCwgMCk7CisJc3ZjX3VucmVnaXN0ZXIoc2Vydik7CiAJa2ZyZWUoc2Vydi0+c3ZfcG9vbHMpOwogCWtmcmVlKHNlcnYpOwogfQpAQCAtNzE4LDU1ICs3MTksMjQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MKHN2Y19leGl0X3RocmVhZCk7CiAKKyNpZmRlZiBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0CisKIC8qCi0gKiBSZWdpc3RlciBhbiBSUEMgc2VydmljZSB3aXRoIHRoZSBsb2NhbCBwb3J0bWFwcGVyLgotICogVG8gdW5yZWdpc3RlciBhIHNlcnZpY2UsIGNhbGwgdGhpcyByb3V0aW5lIHdpdGgKLSAqIHByb3RvIGFuZCBwb3J0ID09IDAuCisgKiBSZWdpc3RlciBhbiAiaW5ldCIgcHJvdG9jb2wgZmFtaWx5IG5ldGlkIHdpdGggdGhlIGxvY2FsCisgKiBycGNiaW5kIGRhZW1vbiB2aWEgYW4gcnBjYmluZCB2NCBTRVQgcmVxdWVzdC4KKyAqCisgKiBObyBuZXRjb25maWcgaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlIGluIHRoZSBrZXJuZWwsIHNvCisgKiB3ZSBtYXAgSVBfIHByb3RvY29sIG51bWJlcnMgdG8gbmV0aWRzIGJ5IGhhbmQuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMgcmV0dXJuZWQKKyAqIGlmIGFueSBlcnJvciBvY2N1cnMuCiAgKi8KLWludAotc3ZjX3JlZ2lzdGVyKHN0cnVjdCBzdmNfc2VydiAqc2VydiwgaW50IHByb3RvLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQorc3RhdGljIGludCBfX3N2Y19ycGNiX3JlZ2lzdGVyNChjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luID0geworCQkuc2luX2ZhbWlseQkJPSBBRl9JTkVULAorCQkuc2luX2FkZHIuc19hZGRyCT0gaHRvbmwoSU5BRERSX0FOWSksCisJCS5zaW5fcG9ydAkJPSBodG9ucyhwb3J0KSwKKwl9OworCWNoYXIgKm5ldGlkOworCisJc3dpdGNoIChwcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19VRFA6CisJCW5ldGlkID0gUlBDQklORF9ORVRJRF9VRFA7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19UQ1A6CisJCW5ldGlkID0gUlBDQklORF9ORVRJRF9UQ1A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCX0KKworCXJldHVybiBycGNiX3Y0X3JlZ2lzdGVyKHByb2dyYW0sIHZlcnNpb24sCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIG5ldGlkKTsKK30KKworLyoKKyAqIFJlZ2lzdGVyIGFuICJpbmV0NiIgcHJvdG9jb2wgZmFtaWx5IG5ldGlkIHdpdGggdGhlIGxvY2FsCisgKiBycGNiaW5kIGRhZW1vbiB2aWEgYW4gcnBjYmluZCB2NCBTRVQgcmVxdWVzdC4KKyAqCisgKiBObyBuZXRjb25maWcgaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlIGluIHRoZSBrZXJuZWwsIHNvCisgKiB3ZSBtYXAgSVBfIHByb3RvY29sIG51bWJlcnMgdG8gbmV0aWRzIGJ5IGhhbmQuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMgcmV0dXJuZWQKKyAqIGlmIGFueSBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQgX19zdmNfcnBjYl9yZWdpc3RlcjYoY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLAorCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luNiBzaW42ID0geworCQkuc2luNl9mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5zaW42X2FkZHIJCT0gSU42QUREUl9BTllfSU5JVCwKKwkJLnNpbjZfcG9ydAkJPSBodG9ucyhwb3J0KSwKKwl9OworCWNoYXIgKm5ldGlkOworCisJc3dpdGNoIChwcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19VRFA6CisJCW5ldGlkID0gUlBDQklORF9ORVRJRF9VRFA2OworCQlicmVhazsKKwljYXNlIElQUFJPVE9fVENQOgorCQluZXRpZCA9IFJQQ0JJTkRfTkVUSURfVENQNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIHJwY2JfdjRfcmVnaXN0ZXIocHJvZ3JhbSwgdmVyc2lvbiwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopJnNpbjYsIG5ldGlkKTsKK30KKworLyoKKyAqIFJlZ2lzdGVyIGEga2VybmVsIFJQQyBzZXJ2aWNlIHZpYSBycGNiaW5kIHZlcnNpb24gNC4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzczsgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcyByZXR1cm5lZAorICogaWYgYW55IGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIGludCBfX3N2Y19yZWdpc3Rlcihjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCisJCQkgIGNvbnN0IHNhX2ZhbWlseV90IGZhbWlseSwKKwkJCSAgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCisJCQkgIGNvbnN0IHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJaW50IGVycm9yOworCisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBfX3N2Y19ycGNiX3JlZ2lzdGVyNChwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCQkJcHJvdG9jb2wsIHBvcnQpOworCWNhc2UgQUZfSU5FVDY6CisJCWVycm9yID0gX19zdmNfcnBjYl9yZWdpc3RlcjYocHJvZ3JhbSwgdmVyc2lvbiwKKwkJCQkJCXByb3RvY29sLCBwb3J0KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCXJldHVybiBlcnJvcjsKKworCQkvKgorCQkgKiBXb3JrIGFyb3VuZCBidWcgaW4gc29tZSB2ZXJzaW9ucyBvZiBMaW51eCBycGNiaW5kCisJCSAqIHdoaWNoIGRvbid0IGFsbG93IHJlZ2lzdHJhdGlvbiBvZiBib3RoIGluZXQgYW5kCisJCSAqIGluZXQ2IG5ldGlkcy4KKwkJICoKKwkJICogRXJyb3IgcmV0dXJuIGlnbm9yZWQgZm9yIG5vdy4KKwkJICovCisJCV9fc3ZjX3JwY2JfcmVnaXN0ZXI0KHByb2dyYW0sIHZlcnNpb24sCisJCQkJCQlwcm90b2NvbCwgcG9ydCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUFGTk9TVVBQT1JUOworfQorCisjZWxzZQkvKiBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0ICovCisKKy8qCisgKiBSZWdpc3RlciBhIGtlcm5lbCBSUEMgc2VydmljZSB2aWEgcnBjYmluZCB2ZXJzaW9uIDIuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMgcmV0dXJuZWQKKyAqIGlmIGFueSBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQgX19zdmNfcmVnaXN0ZXIoY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLAorCQkJICBzYV9mYW1pbHlfdCBmYW1pbHksCisJCQkgIGNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJICBjb25zdCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCWlmIChmYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlyZXR1cm4gcnBjYl9yZWdpc3Rlcihwcm9ncmFtLCB2ZXJzaW9uLCBwcm90b2NvbCwgcG9ydCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0ICovCisKKy8qKgorICogc3ZjX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gUlBDIHNlcnZpY2Ugd2l0aCB0aGUgbG9jYWwgcG9ydG1hcHBlcgorICogQHNlcnY6IHN2Y19zZXJ2IHN0cnVjdCBmb3IgdGhlIHNlcnZpY2UgdG8gcmVnaXN0ZXIKKyAqIEBwcm90bzogdHJhbnNwb3J0IHByb3RvY29sIG51bWJlciB0byBhZHZlcnRpc2UKKyAqIEBwb3J0OiBwb3J0IHRvIGFkdmVydGlzZQorICoKKyAqIFNlcnZpY2UgaXMgcmVnaXN0ZXJlZCBmb3IgYW55IGFkZHJlc3MgaW4gc2VydidzIGFkZHJlc3MgZmFtaWx5CisgKi8KK2ludCBzdmNfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBjb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJIGNvbnN0IHVuc2lnbmVkIHNob3J0IHBvcnQpCiB7CiAJc3RydWN0IHN2Y19wcm9ncmFtCSpwcm9ncDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1bnNpZ25lZCBpbnQJCWk7Ci0JaW50CQkJZXJyb3IgPSAwLCBkdW1teTsKKwlpbnQJCQllcnJvciA9IDA7CiAKLQlpZiAoIXBvcnQpCi0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKKwlCVUdfT04ocHJvdG8gPT0gMCAmJiBwb3J0ID09IDApOwogCiAJZm9yIChwcm9ncCA9IHNlcnYtPnN2X3Byb2dyYW07IHByb2dwOyBwcm9ncCA9IHByb2dwLT5wZ19uZXh0KSB7CiAJCWZvciAoaSA9IDA7IGkgPCBwcm9ncC0+cGdfbnZlcnM7IGkrKykgewogCQkJaWYgKHByb2dwLT5wZ192ZXJzW2ldID09IE5VTEwpCiAJCQkJY29udGludWU7CiAKLQkJCWRwcmludGsoInN2Yzogc3ZjX3JlZ2lzdGVyKCVzLCAlcywgJWQsICVkKSVzXG4iLAorCQkJZHByaW50aygic3ZjOiBzdmNfcmVnaXN0ZXIoJXN2JWQsICVzLCAldSwgJXUpJXNcbiIsCiAJCQkJCXByb2dwLT5wZ19uYW1lLAorCQkJCQlpLAogCQkJCQlwcm90byA9PSBJUFBST1RPX1VEUD8gICJ1ZHAiIDogInRjcCIsCiAJCQkJCXBvcnQsCi0JCQkJCWksCisJCQkJCXNlcnYtPnN2X2ZhbWlseSwKIAkJCQkJcHJvZ3AtPnBnX3ZlcnNbaV0tPnZzX2hpZGRlbj8KIAkJCQkJCSIgKGJ1dCBub3QgdGVsbGluZyBwb3J0bWFwKSIgOiAiIik7CiAKIAkJCWlmIChwcm9ncC0+cGdfdmVyc1tpXS0+dnNfaGlkZGVuKQogCQkJCWNvbnRpbnVlOwogCi0JCQllcnJvciA9IHJwY2JfcmVnaXN0ZXIocHJvZ3AtPnBnX3Byb2csIGksIHByb3RvLCBwb3J0LCAmZHVtbXkpOworCQkJZXJyb3IgPSBfX3N2Y19yZWdpc3Rlcihwcm9ncC0+cGdfcHJvZywgaSwKKwkJCQkJCXNlcnYtPnN2X2ZhbWlseSwgcHJvdG8sIHBvcnQpOwogCQkJaWYgKGVycm9yIDwgMCkKIAkJCQlicmVhazsKLQkJCWlmIChwb3J0ICYmICFkdW1teSkgewotCQkJCWVycm9yID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKLQkJCX0KIAkJfQogCX0KIAotCWlmICghcG9ydCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJcmV0dXJuIGVycm9yOworfQorCisjaWZkZWYgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNAorCitzdGF0aWMgdm9pZCBfX3N2Y191bnJlZ2lzdGVyKGNvbnN0IHUzMiBwcm9ncmFtLCBjb25zdCB1MzIgdmVyc2lvbiwKKwkJCSAgICAgY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJc3RydWN0IHNvY2thZGRyX2luNiBzaW42ID0geworCQkuc2luNl9mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5zaW42X2FkZHIJCT0gSU42QUREUl9BTllfSU5JVCwKKwkJLnNpbjZfcG9ydAkJPSAwLAorCX07CisJaW50IGVycm9yOworCisJZXJyb3IgPSBycGNiX3Y0X3JlZ2lzdGVyKHByb2dyYW0sIHZlcnNpb24sCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSZzaW42LCAiIik7CisJZHByaW50aygic3ZjOiAlcyglc3YldSksIGVycm9yICVkXG4iLAorCQkJX19mdW5jX18sIHByb2duYW1lLCB2ZXJzaW9uLCBlcnJvcik7Cit9CisKKyNlbHNlCS8qIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgKi8KKworc3RhdGljIHZvaWQgX19zdmNfdW5yZWdpc3Rlcihjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCisJCQkgICAgIGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gcnBjYl9yZWdpc3Rlcihwcm9ncmFtLCB2ZXJzaW9uLCAwLCAwKTsKKwlkcHJpbnRrKCJzdmM6ICVzKCVzdiV1KSwgZXJyb3IgJWRcbiIsCisJCQlfX2Z1bmNfXywgcHJvZ25hbWUsIHZlcnNpb24sIGVycm9yKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgKi8KKworLyoKKyAqIEFsbCBuZXRpZHMsIGJpbmQgYWRkcmVzc2VzIGFuZCBwb3J0cyByZWdpc3RlcmVkIGZvciBbcHJvZ3JhbSwgdmVyc2lvbl0KKyAqIGFyZSByZW1vdmVkIGZyb20gdGhlIGxvY2FsIHJwY2JpbmQgZGF0YWJhc2UgKGlmIHRoZSBzZXJ2aWNlIGlzIG5vdAorICogaGlkZGVuKSB0byBtYWtlIHdheSBmb3IgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UuCisgKgorICogVGhlIHJlc3VsdCBvZiB1bnJlZ2lzdHJhdGlvbiBpcyByZXBvcnRlZCB2aWEgZHByaW50ayBmb3IgdGhvc2Ugd2hvIHdhbnQKKyAqIHZlcmlmaWNhdGlvbiBvZiB0aGUgcmVzdWx0LCBidXQgaXMgb3RoZXJ3aXNlIG5vdCBpbXBvcnRhbnQuCisgKi8KK3N0YXRpYyB2b2lkIHN2Y191bnJlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqc2VydikKK3sKKwlzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2dwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisKKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfU0lHUEVORElORyk7CisKKwlmb3IgKHByb2dwID0gc2Vydi0+c3ZfcHJvZ3JhbTsgcHJvZ3A7IHByb2dwID0gcHJvZ3AtPnBnX25leHQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHByb2dwLT5wZ19udmVyczsgaSsrKSB7CisJCQlpZiAocHJvZ3AtPnBnX3ZlcnNbaV0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwcm9ncC0+cGdfdmVyc1tpXS0+dnNfaGlkZGVuKQorCQkJCWNvbnRpbnVlOworCisJCQlfX3N2Y191bnJlZ2lzdGVyKHByb2dwLT5wZ19wcm9nLCBpLCBwcm9ncC0+cGdfbmFtZSk7CisJCX0KIAl9CiAKLQlyZXR1cm4gZXJyb3I7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjX3hwcnQuYyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwppbmRleCBlNDZjODI1Li5iZjViNWNkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNfeHBydC5jCkBAIC0xNTksMTUgKzE1OSw0NCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3hwcnRfaW5pdCk7CiAKLWludCBzdmNfY3JlYXRlX3hwcnQoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBjaGFyICp4cHJ0X25hbWUsIHVuc2lnbmVkIHNob3J0IHBvcnQsCi0JCSAgICBpbnQgZmxhZ3MpCitzdGF0aWMgc3RydWN0IHN2Y194cHJ0ICpfX3N2Y194cG9fY3JlYXRlKHN0cnVjdCBzdmNfeHBydF9jbGFzcyAqeGNsLAorCQkJCQkgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LAorCQkJCQkgdW5zaWduZWQgc2hvcnQgcG9ydCwgaW50IGZsYWdzKQogewotCXN0cnVjdCBzdmNfeHBydF9jbGFzcyAqeGNsOwogCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CiAJCS5zaW5fZmFtaWx5CQk9IEFGX0lORVQsCiAJCS5zaW5fYWRkci5zX2FkZHIJPSBodG9ubChJTkFERFJfQU5ZKSwKIAkJLnNpbl9wb3J0CQk9IGh0b25zKHBvcnQpLAogCX07CisJc3RydWN0IHNvY2thZGRyX2luNiBzaW42ID0geworCQkuc2luNl9mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5zaW42X2FkZHIJCT0gSU42QUREUl9BTllfSU5JVCwKKwkJLnNpbjZfcG9ydAkJPSBodG9ucyhwb3J0KSwKKwl9OworCXN0cnVjdCBzb2NrYWRkciAqc2FwOworCXNpemVfdCBsZW47CisKKwlzd2l0Y2ggKHNlcnYtPnN2X2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJc2FwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzaW47CisJCWxlbiA9IHNpemVvZihzaW4pOworCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQlzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnNpbjY7CisJCWxlbiA9IHNpemVvZihzaW42KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEVSUl9QVFIoLUVBRk5PU1VQUE9SVCk7CisJfQorCisJcmV0dXJuIHhjbC0+eGNsX29wcy0+eHBvX2NyZWF0ZShzZXJ2LCBzYXAsIGxlbiwgZmxhZ3MpOworfQorCitpbnQgc3ZjX2NyZWF0ZV94cHJ0KHN0cnVjdCBzdmNfc2VydiAqc2VydiwgY2hhciAqeHBydF9uYW1lLCB1bnNpZ25lZCBzaG9ydCBwb3J0LAorCQkgICAgaW50IGZsYWdzKQoreworCXN0cnVjdCBzdmNfeHBydF9jbGFzcyAqeGNsOworCiAJZHByaW50aygic3ZjOiBjcmVhdGluZyB0cmFuc3BvcnQgJXNbJWRdXG4iLCB4cHJ0X25hbWUsIHBvcnQpOwogCXNwaW5fbG9jaygmc3ZjX3hwcnRfY2xhc3NfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh4Y2wsICZzdmNfeHBydF9jbGFzc19saXN0LCB4Y2xfbGlzdCkgewpAQCAtMTgwLDkgKzIwOSw3IEBACiAJCQlnb3RvIGVycjsKIAogCQlzcGluX3VubG9jaygmc3ZjX3hwcnRfY2xhc3NfbG9jayk7Ci0JCW5ld3hwcnQgPSB4Y2wtPnhjbF9vcHMtPgotCQkJeHBvX2NyZWF0ZShzZXJ2LCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbiksCi0JCQkJICAgZmxhZ3MpOworCQluZXd4cHJ0ID0gX19zdmNfeHBvX2NyZWF0ZSh4Y2wsIHNlcnYsIHBvcnQsIGZsYWdzKTsKIAkJaWYgKElTX0VSUihuZXd4cHJ0KSkgewogCQkJbW9kdWxlX3B1dCh4Y2wtPnhjbF9vd25lcik7CiAJCQlyZXR1cm4gUFRSX0VSUihuZXd4cHJ0KTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggM2U2NTcxOS4uOTUyOTNmNSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTExMTQsNiArMTExNCw3IEBACiAJc3RydWN0IHN2Y19zb2NrCSpzdnNrOwogCXN0cnVjdCBzb2NrCSppbmV0OwogCWludAkJcG1hcF9yZWdpc3RlciA9ICEoZmxhZ3MgJiBTVkNfU09DS19BTk9OWU1PVVMpOworCWludAkJdmFsOwogCiAJZHByaW50aygic3ZjOiBzdmNfc2V0dXBfc29ja2V0ICVwXG4iLCBzb2NrKTsKIAlpZiAoIShzdnNrID0ga3phbGxvYyhzaXplb2YoKnN2c2spLCBHRlBfS0VSTkVMKSkpIHsKQEAgLTExNDYsNiArMTE0NywxOCBAQAogCWVsc2UKIAkJc3ZjX3RjcF9pbml0KHN2c2ssIHNlcnYpOwogCisJLyoKKwkgKiBXZSBzdGFydCBvbmUgbGlzdGVuZXIgcGVyIHN2X3NlcnYuICBXZSB3YW50IEFGX0lORVQKKwkgKiByZXF1ZXN0cyB0byBiZSBhdXRvbWF0aWNhbGx5IHNodW50ZWQgdG8gb3VyIEFGX0lORVQ2CisJICogbGlzdGVuZXIgdXNpbmcgYSBtYXBwZWQgSVB2NCBhZGRyZXNzLiAgTWFrZSBzdXJlCisJICogbm8tb25lIHN0YXJ0cyBhbiBlcXVpdmFsZW50IElQdjQgbGlzdGVuZXIsIHdoaWNoCisJICogd291bGQgc3RlYWwgb3VyIGluY29taW5nIGNvbm5lY3Rpb25zLgorCSAqLworCXZhbCA9IDA7CisJaWYgKHNlcnYtPnN2X2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJa2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX0lQVjYsIElQVjZfVjZPTkxZLAorCQkJCQkoY2hhciAqKSZ2YWwsIHNpemVvZih2YWwpKTsKKwogCWRwcmludGsoInN2Yzogc3ZjX3NldHVwX3NvY2tldCBjcmVhdGVkICVwIChpbmV0ICVwKVxuIiwKIAkJCQlzdnNrLCBzdnNrLT5za19zayk7CiAKQEAgLTExNTQsOCArMTE2Nyw3IEBACiAKIGludCBzdmNfYWRkc29jayhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsCiAJCWludCBmZCwKLQkJY2hhciAqbmFtZV9yZXR1cm4sCi0JCWludCAqcHJvdG8pCisJCWNoYXIgKm5hbWVfcmV0dXJuKQogewogCWludCBlcnIgPSAwOwogCXN0cnVjdCBzb2NrZXQgKnNvID0gc29ja2ZkX2xvb2t1cChmZCwgJmVycik7CkBAIC0xMTkwLDcgKzEyMDIsNiBAQAogCQlzb2NrZmRfcHV0KHNvKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JaWYgKHByb3RvKSAqcHJvdG8gPSBzby0+c2stPnNrX3Byb3RvY29sOwogCXJldHVybiBvbmVfc29ja19uYW1lKG5hbWVfcmV0dXJuLCBzdnNrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN2Y19hZGRzb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfcmVjdmZyb20uYyBiL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfcmVjdmZyb20uYwppbmRleCA3NGRlMzFhLi5hNDc1NjU3IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3JlY3Zmcm9tLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV9yZWN2ZnJvbS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKICAqCiAgKiBBc3N1bXB0aW9uczoKICAqIC0gY2h1bmtbMF0tPnBvc2l0aW9uIHBvaW50cyB0byBwYWdlc1swXSBhdCBhbiBvZmZzZXQgb2YgMAotICogLSBwYWdlc1tdIGlzIG5vdCBwaHlzaWNhbGx5IG9yIHZpcnR1YWxseSBjb250aWdvdXMgYW5kIGNvbnNpc3RzIG9mCisgKiAtIHBhZ2VzW10gaXMgbm90IHBoeXNpY2FsbHkgb3IgdmlydHVhbGx5IGNvbnRpZ3VvdXMgYW5kIGNvbnNpc3RzIG9mCiAgKiAgIFBBR0VfU0laRSBlbGVtZW50cy4KICAqCiAgKiBPdXRwdXQ6CkBAIC0xMjUsNyArMTI1LDcgQEAKICAqICAgY2h1bmsgaW4gdGhlIHJlYWQgbGlzdAogICoKICAqLwotc3RhdGljIGludCByZG1hX3JjbF90b19zZ2Uoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCwKK3N0YXRpYyBpbnQgbWFwX3JlYWRfY2h1bmtzKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnhwcnQsCiAJCQkgICBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQkJICAgc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKmhlYWQsCiAJCQkgICBzdHJ1Y3QgcnBjcmRtYV9tc2cgKnJtc2dwLApAQCAtMjExLDI2ICsyMTEsMTI4IEBACiAJcmV0dXJuIHNnZV9ubzsKIH0KIAotc3RhdGljIHZvaWQgcmRtYV9zZXRfY3R4dF9zZ2Uoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCwKLQkJCSAgICAgIHN0cnVjdCBzdmNfcmRtYV9vcF9jdHh0ICpjdHh0LAotCQkJICAgICAgc3RydWN0IGt2ZWMgKnZlYywKLQkJCSAgICAgIHU2NCAqc2dsX29mZnNldCwKLQkJCSAgICAgIGludCBjb3VudCkKKy8qIE1hcCBhIHJlYWQtY2h1bmstbGlzdCB0byBhbiBYRFIgYW5kIGZhc3QgcmVnaXN0ZXIgdGhlIHBhZ2UtbGlzdC4KKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqIC0gY2h1bmtbMF0JcG9zaXRpb24gcG9pbnRzIHRvIHBhZ2VzWzBdIGF0IGFuIG9mZnNldCBvZiAwCisgKiAtIHBhZ2VzW10Jd2lsbCBiZSBtYWRlIHBoeXNpY2FsbHkgY29udGlndW91cyBieSBjcmVhdGluZyBhIG9uZS1vZmYgbWVtb3J5CisgKgkJcmVnaW9uIHVzaW5nIHRoZSBmYXN0cmVnIHZlcmIuCisgKiAtIGJ5dGVfY291bnQgaXMgIyBvZiBieXRlcyBpbiByZWFkLWNodW5rLWxpc3QKKyAqIC0gY2hfY291bnQJaXMgIyBvZiBjaHVua3MgaW4gcmVhZC1jaHVuay1saXN0CisgKgorICogT3V0cHV0OgorICogLSBzZ2UgYXJyYXkgcG9pbnRpbmcgaW50byBwYWdlc1tdIGFycmF5LgorICogLSBjaHVua19zZ2UgYXJyYXkgc3BlY2lmeWluZyBzZ2UgaW5kZXggYW5kIGNvdW50IGZvciBlYWNoCisgKiAgIGNodW5rIGluIHRoZSByZWFkIGxpc3QKKyAqLworc3RhdGljIGludCBmYXN0X3JlZ19yZWFkX2NodW5rcyhzdHJ1Y3Qgc3ZjeHBydF9yZG1hICp4cHJ0LAorCQkJCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCQkJc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKmhlYWQsCisJCQkJc3RydWN0IHJwY3JkbWFfbXNnICpybXNncCwKKwkJCQlzdHJ1Y3Qgc3ZjX3JkbWFfcmVxX21hcCAqcnBsX21hcCwKKwkJCQlzdHJ1Y3Qgc3ZjX3JkbWFfcmVxX21hcCAqY2hsX21hcCwKKwkJCQlpbnQgY2hfY291bnQsCisJCQkJaW50IGJ5dGVfY291bnQpCit7CisJaW50IHBhZ2Vfbm87CisJaW50IGNoX25vOworCXUzMiBvZmZzZXQ7CisJc3RydWN0IHJwY3JkbWFfcmVhZF9jaHVuayAqY2g7CisJc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXI7CisJaW50IHJldCA9IDA7CisKKwlmcm1yID0gc3ZjX3JkbWFfZ2V0X2ZybXIoeHBydCk7CisJaWYgKElTX0VSUihmcm1yKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZWFkLT5mcm1yID0gZnJtcjsKKwloZWFkLT5hcmcuaGVhZFswXSA9IHJxc3RwLT5ycV9hcmcuaGVhZFswXTsKKwloZWFkLT5hcmcudGFpbFswXSA9IHJxc3RwLT5ycV9hcmcudGFpbFswXTsKKwloZWFkLT5hcmcucGFnZXMgPSAmaGVhZC0+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+c2NfY21faWQtPmRldmljZSwKKwkJCQkgIHNnZS5hZGRyLCBQQUdFX1NJWkUsCisJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwogCQlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKaW5kZXggNDQ4NmM1OS4uOWEyODhkNSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0c29jay5jCisrKyBiL25ldC9zdW5ycGMveHBydHNvY2suYwpAQCAtMyw4ICszLDggQEAKICAqCiAgKiBDbGllbnQtc2lkZSB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gZm9yIHNvY2tldHMuCiAgKgotICogVENQIGNhbGxiYWNrIHJhY2VzIGZpeGVzIChDKSAxOTk4IFJlZCBIYXQgU29mdHdhcmUgPGFsYW5AcmVkaGF0LmNvbT4KLSAqIFRDUCBzZW5kIGZpeGVzIChDKSAxOTk4IFJlZCBIYXQgU29mdHdhcmUgPGFsYW5AcmVkaGF0LmNvbT4KKyAqIFRDUCBjYWxsYmFjayByYWNlcyBmaXhlcyAoQykgMTk5OCBSZWQgSGF0CisgKiBUQ1Agc2VuZCBmaXhlcyAoQykgMTk5OCBSZWQgSGF0CiAgKiBUQ1AgTkZTIHJlbGF0ZWQgcmVhZCArIHdyaXRlIGZpeGVzCiAgKiAgKEMpIDE5OTkgRGF2ZSBBaXJsaWUsIFVuaXZlcnNpdHkgb2YgTGltZXJpY2ssIElyZWxhbmQgPGFpcmxpZWRAbGludXguaWU+CiAgKgpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IDAxNTYwNmIuLmM2NDdhYWIgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogTkVUNDoJSW1wbGVtZW50YXRpb24gb2YgQlNEIFVuaXggZG9tYWluIHNvY2tldHMuCiAgKgotICogQXV0aG9yczoJQWxhbiBDb3gsIDxhbGFuLmNveEBsaW51eC5vcmc+CisgKiBBdXRob3JzOglBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jvb3RncmFwaC5wbCBiL3NjcmlwdHMvYm9vdGdyYXBoLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDMzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbApAQCAtMCwwICsxLDE0NyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMgQ29weXJpZ2h0IDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwKKyMKKyMgVGhpcyBwcm9ncmFtIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIGluIGEgZmlsZSBuYW1lZCBDT1BZSU5HOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisjIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyMKKyMgQXV0aG9yczoKKyMgCUFyamFuIHZhbiBkZSBWZW4gPGFyamFuQGxpbnV4LmludGVsLmNvbT4KKworCisjCisjIFRoaXMgc2NyaXB0IHR1cm5zIGEgZG1lc2cgb3V0cHV0IGludG8gYSBTVkcgZ3JhcGhpYyB0aGF0IHNob3dzIHdoaWNoCisjIGZ1bmN0aW9ucyB0YWtlIGhvdyBtdWNoIHRpbWUuIFlvdSBjYW4gdmlldyBTVkcgZ3JhcGhpY3Mgd2l0aCB2YXJpb3VzCisjIHByb2dyYW1zLCBpbmNsdWRpbmcgSW5rc2NhcGUsIFRoZSBHaW1wIGFuZCBGaXJlZm94LgorIworIworIyBGb3IgdGhpcyBzY3JpcHQgdG8gd29yaywgdGhlIGtlcm5lbCBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIHRoZQorIyBDT05GSUdfUFJJTlRLX1RJTUUgY29uZmlndXJhdGlvbiBvcHRpb24gZW5hYmxlZCwgYW5kIHdpdGgKKyMgImluaXRjYWxsX2RlYnVnIiBwYXNzZWQgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisjCisjIHVzYWdlOgorIyAJZG1lc2cgfCBwZXJsIHNjcmlwdHMvYm9vdGdyYXBoLnBsID4gb3V0cHV0LnN2ZworIworCitteSBAcm93czsKK215ICVzdGFydCwgJWVuZCwgJXJvdzsKK215ICRkb25lID0gMDsKK215ICRyb3djb3VudCA9IDA7CitteSAkbWF4dGltZSA9IDA7CitteSAkZmlyc3R0aW1lID0gMTAwOworbXkgJGNvdW50ID0gMDsKK3doaWxlICg8PikgeworCW15ICRsaW5lID0gJF87CisJaWYgKCRsaW5lID1+IC8oWzAtOVwuXSspXF0gY2FsbGluZyAgKFthLXpBLVowLTlcX10rKVwrLykgeworCQlteSAkZnVuYyA9ICQyOworCQlpZiAoJGRvbmUgPT0gMCkgeworCQkJJHN0YXJ0eyRmdW5jfSA9ICQxOworCQkJaWYgKCQxIDwgJGZpcnN0dGltZSkgeworCQkJCSRmaXJzdHRpbWUgPSAkMTsKKwkJCX0KKwkJfQorCQkkcm93eyRmdW5jfSA9IDE7CisJCWlmICgkbGluZSA9fiAvXEAgKFswLTldKykvKSB7CisJCQlteSAkcGlkID0gJDE7CisJCQlpZiAoIWRlZmluZWQoJHJvd3NbJHBpZF0pKSB7CisJCQkJJHJvd2NvdW50ID0gJHJvd2NvdW50ICsgMTsKKwkJCQkkcm93c1skcGlkXSA9ICRyb3djb3VudDsKKwkJCX0KKwkJCSRyb3d7JGZ1bmN9ID0gJHJvd3NbJHBpZF07CisJCX0KKwkJJGNvdW50ID0gJGNvdW50ICsgMTsKKwl9CisKKwlpZiAoJGxpbmUgPX4gLyhbMC05XC5dKylcXSBpbml0Y2FsbCAoW2EtekEtWjAtOVxfXSspXCsuKnJldHVybmVkLykgeworCQlpZiAoJGRvbmUgPT0gMCkgeworCQkJJGVuZHskMn0gPSAkMTsKKwkJCSRtYXh0aW1lID0gJDE7CisJCX0KKwl9CisJaWYgKCRsaW5lID1+IC9Xcml0ZSBwcm90ZWN0aW5nIHRoZS8pIHsKKwkJJGRvbmUgPSAxOworCX0KKwlpZiAoJGxpbmUgPX4gL0ZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnkvKSB7CisJCSRkb25lID0gMTsKKwl9Cit9CisKK2lmICgkY291bnQgPT0gMCkgeworCXByaW50ICJObyBkYXRhIGZvdW5kIGluIHRoZSBkbWVzZy4gTWFrZSBzdXJlIHRoYXQgJ3ByaW50ay50aW1lPTEnIGFuZFxuIjsKKwlwcmludCAiJ2luaXRjYWxsX2RlYnVnJyBhcmUgcGFzc2VkIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLlxuXG4iOworCXByaW50ICJVc2FnZTogXG4iOworCXByaW50ICIgICAgICBkbWVzZyB8IHBlcmwgc2NyaXB0cy9ib290Z3JhcGgucGwgPiBvdXRwdXQuc3ZnXG5cbiI7CisJZXhpdDsKK30KKworcHJpbnQgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIj8+IFxuIjsKK3ByaW50ICI8c3ZnIHdpZHRoPVwiMTAwMFwiIGhlaWdodD1cIjEwMCVcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuIjsKKworbXkgQHN0eWxlczsKKworJHN0eWxlc1swXSA9ICJmaWxsOnJnYigwLDAsMjU1KTtmaWxsLW9wYWNpdHk6MC41O3N0cm9rZS13aWR0aDoxO3N0cm9rZTpyZ2IoMCwwLDApIjsKKyRzdHlsZXNbMV0gPSAiZmlsbDpyZ2IoMCwyNTUsMCk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzJdID0gImZpbGw6cmdiKDI1NSwwLDIwKTtmaWxsLW9wYWNpdHk6MC41O3N0cm9rZS13aWR0aDoxO3N0cm9rZTpyZ2IoMCwwLDApIjsKKyRzdHlsZXNbM10gPSAiZmlsbDpyZ2IoMjU1LDI1NSwyMCk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzRdID0gImZpbGw6cmdiKDI1NSwwLDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzVdID0gImZpbGw6cmdiKDAsMjU1LDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzZdID0gImZpbGw6cmdiKDAsMTI4LDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzddID0gImZpbGw6cmdiKDAsMjU1LDEyOCk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzhdID0gImZpbGw6cmdiKDI1NSwwLDEyOCk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzldID0gImZpbGw6cmdiKDI1NSwyNTUsMTI4KTtmaWxsLW9wYWNpdHk6MC41O3N0cm9rZS13aWR0aDoxO3N0cm9rZTpyZ2IoMCwwLDApIjsKKyRzdHlsZXNbMTBdID0gImZpbGw6cmdiKDI1NSwxMjgsMjU1KTtmaWxsLW9wYWNpdHk6MC41O3N0cm9rZS13aWR0aDoxO3N0cm9rZTpyZ2IoMCwwLDApIjsKKyRzdHlsZXNbMTFdID0gImZpbGw6cmdiKDEyOCwyNTUsMjU1KTtmaWxsLW9wYWNpdHk6MC41O3N0cm9rZS13aWR0aDoxO3N0cm9rZTpyZ2IoMCwwLDApIjsKKworbXkgJG11bHQgPSA5NTAuMCAvICgkbWF4dGltZSAtICRmaXJzdHRpbWUpOworbXkgJHRocmVzaG9sZCA9ICgkbWF4dGltZSAtICRmaXJzdHRpbWUpIC8gNjAuMDsKK215ICRzdHlsZWNvdW50ZXIgPSAwOword2hpbGUgKCgka2V5LCR2YWx1ZSkgPSBlYWNoICVzdGFydCkgeworCW15ICRkdXJhdGlvbiA9ICRlbmR7JGtleX0gLSAkc3RhcnR7JGtleX07CisKKwlpZiAoJGR1cmF0aW9uID49ICR0aHJlc2hvbGQpIHsKKwkJbXkgJHMsICRzMiwgJGUsICR5OworCQkkcyA9ICgkdmFsdWUgLSAkZmlyc3R0aW1lKSAqICRtdWx0OworCQkkczIgPSAkcyArIDY7CisJCSRlID0gKCRlbmR7JGtleX0gLSAkZmlyc3R0aW1lKSAqICRtdWx0OworCQkkdyA9ICRlIC0gJHM7CisKKwkJJHkgPSAkcm93eyRrZXl9ICogMTUwOworCQkkeTIgPSAkeSArIDQ7CisKKwkJJHN0eWxlID0gJHN0eWxlc1skc3R5bGVjb3VudGVyXTsKKwkJJHN0eWxlY291bnRlciA9ICRzdHlsZWNvdW50ZXIgKyAxOworCQlpZiAoJHN0eWxlY291bnRlciA+IDExKSB7CisJCQkkc3R5bGVjb3VudGVyID0gMDsKKwkJfTsKKworCQlwcmludCAiPHJlY3QgeD1cIiRzXCIgd2lkdGg9XCIkd1wiIHk9XCIkeVwiIGhlaWdodD1cIjE0NVwiIHN0eWxlPVwiJHN0eWxlXCIvPlxuIjsKKwkJcHJpbnQgIjx0ZXh0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgkczIsJHkyKSByb3RhdGUoOTApXCI+JGtleTwvdGV4dD5cbiI7CisJfQorfQorCisKKyMgcHJpbnQgdGhlIHRpbWUgbGluZSBvbiB0b3AKK215ICR0aW1lID0gJGZpcnN0dGltZTsKK215ICRzdGVwID0gKCRtYXh0aW1lIC0gJGZpcnN0dGltZSkgLyAxNTsKK3doaWxlICgkdGltZSA8ICRtYXh0aW1lKSB7CisJbXkgJHMyID0gKCR0aW1lIC0gJGZpcnN0dGltZSkgKiAkbXVsdDsKKwlteSAkdG0gPSBpbnQoJHRpbWUgKiAxMDApIC8gMTAwLjA7CisJcHJpbnQgIjx0ZXh0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgkczIsODkpIHJvdGF0ZSg5MClcIj4kdG08L3RleHQ+XG4iOworCSR0aW1lID0gJHRpbWUgKyAkc3RlcDsKK30KKworcHJpbnQgIjwvc3ZnPlxuIjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwppbmRleCA0NzNmOTRlLi5kNGRjMjIyIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC0yMDYsNiArMjA2LDIwIEBACiAJCWRvX3VzYl9lbnRyeV9tdWx0aShzeW12YWwgKyBpLCBtb2QpOwogfQogCisvKiBMb29rcyBsaWtlOiBoaWQ6Yk52TnBOICovCitzdGF0aWMgaW50IGRvX2hpZF9lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCSAgICAgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlpZC0+dmVuZG9yID0gVE9fTkFUSVZFKGlkLT52ZW5kb3IpOworCWlkLT5wcm9kdWN0ID0gVE9fTkFUSVZFKGlkLT5wcm9kdWN0KTsKKworCXNwcmludGYoYWxpYXMsICJoaWQ6YiUwNFgiLCBpZC0+YnVzKTsKKwlBREQoYWxpYXMsICJ2IiwgaWQtPnZlbmRvciAhPSBISURfQU5ZX0lELCBpZC0+dmVuZG9yKTsKKwlBREQoYWxpYXMsICJwIiwgaWQtPnByb2R1Y3QgIT0gSElEX0FOWV9JRCwgaWQtPnByb2R1Y3QpOworCisJcmV0dXJuIDE7Cit9CisKIC8qIExvb2tzIGxpa2U6IGllZWUxMzk0OnZlbk5tb05zcE52ZXJOICovCiBzdGF0aWMgaW50IGRvX2llZWUxMzk0X2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJICAgICBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkICppZCwgY2hhciAqYWxpYXMpCkBAIC03NDUsNiArNzU5LDEwIEBACiAJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF91c2JfZGV2aWNlX3RhYmxlIikpCiAJCS8qIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgYmNkRGV2aWNlIHJhbmdlcyAqLwogCQlkb191c2JfdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIG1vZCk7CisJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9oaWRfZGV2aWNlX3RhYmxlIikpCisJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLAorCQkJIHNpemVvZihzdHJ1Y3QgaGlkX2RldmljZV9pZCksICJoaWQiLAorCQkJIGRvX2hpZF9lbnRyeSwgbW9kKTsKIAllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX2llZWUxMzk0X2RldmljZV90YWJsZSIpKQogCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwKIAkJCSBzaXplb2Yoc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCksICJpZWVlMTM5NCIsCg==